![](/img/trans.png)
[英]Why does the python strtobool method return an Int instead of a bool?
[英]Why does hash() method return short Hash value with int in Python?
在 Python 3 中調用
hash()<\/code>方法時,我注意到它在接收
int<\/code>數據類型但使用
string<\/code>類型時不會返回長整數。
這應該以這種方式工作嗎? 如果真的是這樣的話,對於
int<\/code>類型具有短哈希值,它不會因為它太短而導致沖突嗎?
for i in [i for i in range(5)]:
print(hash(i))
print(hash("abc"))
在 CPython 中,默認的 Python 解釋器實現,內置hash
以這種方式完成:
對於數字類型,數字 x 的散列基於 x 以素數 P = 2**_PyHASH_BITS - 1 為模的約簡。它的設計使得當 x 和 y 在數值上相等時 hash(x) == hash(y) , 即使 x 和 y 有不同的類型
_PyHASH_BITS
是61
(64 位系統)或31
(32 位系統)(定義在這里)
所以在 64 位系統上,內置hash
看起來像這個函數:
def hash(number):
return number % (2 ** 61 - 1)
這就是為什么對於小整數你得到相同的值,而例如hash(2305843009213693950)
返回2305843009213693950
和hash(2305843009213693951)
返回0
hash
函數的唯一目的是產生一個整數值,可用於將對象插入到字典中。 hash
唯一保證的是,如果a == b
,則hash(a) == hash(b)
。 對於用戶定義的類Foo
,用戶有責任確保Foo.__eq__
和Foo.__hash__
強制執行此保證。
其他任何內容都取決於實現,您不應將任何值讀入hash(x)
的任何值x
。 具體來說, a != b
允許hash(a) == hash(b)
,並且任何特定x
都不需要hash(x) == x
x 。
您應該使用 hashlib 模塊:
>>> import hashlib()
>>> m.update(b'abc')
>>> m.hexdigest()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.