1

Django Design Patterns中,作者推荐使用 zlib.crc32 来屏蔽 URL 中的主键。经过一些快速测试后,我注意到 crc32 大约有一半时间产生负整数,这似乎不适合在 URL 中使用。zlib.adler32 似乎没有产生负面影响,但被描述为比 CRC “弱”

  1. 这种方法(CRC 或 Adler-32)在 URL 中用作主键的替代方法是否安全?(即碰撞安全吗?)
  2. “较弱”的 Adler-32 是完成这项任务的令人满意的替代品吗?
  3. 你到底是怎么扭转这个局面的?!即如何从校验和中确定原始主键?
4

3 回答 3

1

您可以将 32 位 CRC 值解释为无符号整数。

于 2010-04-09T20:35:53.050 回答
1

经过进一步调查,这似乎是一个非常糟糕的主意:

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

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

于 2010-04-09T21:03:18.300 回答
1

问题不在于散列值。问题是将哈希映射回密钥。即使存在冲突,您也可以始终递增,直到遇到未使用的哈希。

哈希用于例如身份验证的原因是因为已经有一个密钥(例如用户名)可用于查找适当的记录。那时,只需将给定的哈希值与存储的哈希值进行比较即可。如果您使用哈希来掩盖密钥,那么它会比仅比较它更棘手。将散列本身变成密钥将解决这个问题。

于 2010-04-09T21:11:53.323 回答