CRC32 碰撞概率

CRC32 Collision Probability

我已经对其他问题做了很多检查,但我仍然不确定这个问题。

这是我的使用案例:

我有一个在线购物车。有时,某些客户觉得订购过程过于繁琐,或者有些客户在线订购不会减少,他们需要实际的 PDF 估算(报价)才能购买产品。

所以我编写了一个模块,该模块获取购物车内容,并以 PDF 估算的形式整齐地布局。

现在因为这个过程只用到购物车的内容,没有用到任何其他东西,连数据库都没有,所以我必须创建一个唯一的Estimate document number,这样如果客户支付报价,他们就有了参考在他们的付款说明中使用。

购物车目前生成一个 5 位数的购物车 ID,每个客户根据他们的会话是唯一的。我已经使用了这个 5 位数的购物车 ID,然后向其中添加了 UNIX 时间,这为我提供了一个很好的长数字,可用作估算文档编号。

所以我最终得到这样的结果:363821482812537 [36382 是购物车 ID,1482812537 是生成 PDF 估算值时的 unix 时间]

问题是它太长了,而且银行付款参考资料有限,这将成为一个问题。理想情况下,我希望将其控制在 10 个字符以内。

我决定查看 CRC32 来缩短生成的估计数字,它似乎能够将估计数字缩短到可接受的字符数。

但是,任何人都可以阐明我可能会遇到什么样的碰撞吗?

需要考虑的几件事:

  1. 购物车 ID 始终为 5 位数字。

  2. Unix 时间将始终为 10 位数字,直到 2286 年。

[所以我们总是会得到需要编码的 15 位数字,不会更多]

  1. 有一个保护措施,如果偶然发生重复,则会抛出错误,并提供重试和生成估计的选项。这是通过将估算保存到与估算编号匹配的文件名(或在本例中为估算编号的 CRC32 散列),然后首先检查是否存在具有该散列的文件名来完成的。

  2. 暂时不允许客户自己生成估算值,原因对我的问题而言并不重要。因此只有管理员可以生成估算值。

我的担心很简单,我会发现自己 运行 经常与我的 15 位数字到 CRC32 哈希编码发生冲突,还是很少 运行 发生冲突?

为什么不只维护一个估算值,每次需要一个新的估算值时,您只需增加该估算值?您已经有效地维护了一个已用数字列表以检查是否存在冲突,因此只需将计数器放在那里即可。那么你只需要看一个东西,而不是n个东西。通过采用 CRC,您将丢弃可能尝试从估计数字中提取的信息,因此首先从该信息中获取 ID 是没有意义的。您的方法似乎 比实际需要的要复杂。

单次碰撞的概率为2-32。数据内容并不重要,只要它超过 32 位即可,在本例中就是这样,因为 CRC 可以很好地混合位。但是,如果您之前生成了 n 估计值,那么您有 n 次碰撞的机会。因此,随着 n 的增长,发生碰撞的可能性也会相应增加。 (参见生日问题。)结果,仅经过 77,164 次估计,他们的两个哈希值发生冲突的概率为 50%。