【发布时间】:2017-11-24 20:48:30
【问题描述】:
当我在字符串上使用 Python 内置的 hash() 函数时,我只是在玩它时发现了一些奇怪的东西。通常,一个正常的哈希函数应该是不相关的,从hash(A),hash(B) 应该是完全不可识别的(对于不相关/不可识别的充分定义)。
但是,这个快速的小脚本显示不同
In [1]: for i in range(15):
...: print hash('test{0}'.format(i))
...:
-5092793511388848639
-5092793511388848640
-5092793511388848637
-5092793511388848638
-5092793511388848635
-5092793511388848636
-5092793511388848633
-5092793511388848634
-5092793511388848631
-5092793511388848632
5207588497627702649
5207588497627702648
5207588497627702651
5207588497627702650
5207588497627702653
我了解 Python 的 hash() 函数在任何情况下都不应该是加密安全的,为此您将使用 hashlib 库,但为什么 testX 的值如此定期分布?在我看来,它的碰撞行为可能很差。
【问题讨论】:
-
Python 3 似乎已经解决了这个问题。使用 Python 3,传播范围更广。
-
哈希函数用于快速进行字典/集合索引,而不是像 MD5 那样防止冲突(保护更好但计算成本更高)
-
@jonrsharpe 啊,防止 DoS 的自动盐。好吧,它仍然解决了字符串过于相似的问题。
-
对我来说看起来像 完美 碰撞行为。你试过
for i in range(15): print(hash(i))吗?
标签: python python-2.7 hash language-design