簡體   English   中英

為什么 hash() 方法在 Python 中返回帶有 int 的短 Hash 值?

[英]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_BITS61 (64 位系統)或31 (32 位系統)(定義在這里

所以在 64 位系統上,內置hash看起來像這個函數:

def hash(number):
    return number % (2 ** 61 - 1)

這就是為什么對於小整數你得到相同的值,而例如hash(2305843009213693950)返回2305843009213693950hash(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM