它的设计图案, 作者建议使用zlib.crc32掩主键在的网址。在一些快速测试,我注意到,crc32产生负面整数的大约一半的时间,这似乎不宜用在一个网址。zlib.adler32不会出现产生负,但是描述为 "较弱的"比CRC.

  1. 是这种方法(无论是CRC或Adler-32)安全使用一个网址作为一个备用的一个主要钥匙?(即它是碰撞的安全吗?)
  2. 是"较弱的"Adler-32一个令人满意的替代选择这个任务吗?
  3. 到底如何做你扭转这个?!那就是,如何确定原始主键从校?
有帮助吗?

解决方案

问题不是散列值。问题是映射的散列回的关键。即使有的碰撞你总是可以增加,直到你打一个未使用的散列。

本哈希原因是用于例如认证是因为已经有了一个关键(e。克的用户名),可用于寻找适当的记录。在这一点就变成只是一个问题比较给予的散列对所储存的散列。如果你使用的散列掩盖的关键,而不是那么这将是棘手的不仅仅是比较。转向散列入关键将解决这个虽然。

其他提示

你可以解释的32位CRC值为无符号的整数。

经进一步调查,这似乎是一个很坏的想法:

In [11]: s = set([zlib.crc32(str(x)) for x in xrange(20000000)])
In [12]: len(s)
Out[12]: 19989760
In [13]: 20000000 - len(s)
Out[13]: 10240

这是10,240个冲突中的20,000,000个主键。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top