要回答這個問題,首先明白壹個概念:
哈希(Hash)
Hash,壹般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是壹種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來唯壹的確定輸入值。簡單的說就是壹種將任意長度的消息壓縮到某壹固定長度的消息摘要的函數。
所有散列函數都有如下壹個基本特性:如果兩個散列值是不相同的(根據同壹函數),那麽這兩個散列值的原始輸入也是不相同的。這個特性是散列函數具有確定性的結果。但另壹方面,散列函數的輸入和輸出不是壹壹對應的,如果兩個散列值相同,兩個輸入值很可能是相同的,但並不能絕對肯定二者壹定相等。輸入壹些數據計算出散列值,然後部分改變輸入值,壹個具有強混淆特性的散列函數會產生壹個完全不同的散列值。
回到字典key問題,python的dict的key必須是唯壹的,所以,其必須是壹個可哈希的值,才能保證得到唯壹的內存地址。在python裏,字符串,數字,元組都是不可變對象,也是可哈希的值。