我有一个缓存应用程序,它使用 CRC64 值来确保数据完整性。我正在考虑放置一个额外的字段,一个与数据一起传递的时间戳在各种缓存服务器之间进行比较,以查看数据是否已更改。
但是,这需要更改协议。 虽然这没什么大不了的,但我已经有了CRC64 可以用作某些事情已更改的指标。
有谁知道产生相同CRC64的两个数据块的统计数据?如果不是,我怎么能计算它或估计它的可能性?
如果你假设crc64是"完美的",那么这些数字是非常合理的:
对于 1% 的冲突概率,您需要 6.1 × 10^8 个条目。对于 50% 的冲突概率,您需要 5.1 × 10^9 个条目。
当然,如果数据可能由恶意来源提供,那么像crc64这样简单的哈希中的冲突可以很容易地生成,并且冲突可能会很猖獗。因此,是否走这条路取决于输入数据的来源和碰撞的潜在后果。
任何两个给定块碰撞的概率是 1/264,或大约 1.8 × 1019 中的 1。
但是,如果您对大小为 N 的群体中任意两个块的碰撞率感兴趣,则概率会迅速变得更大。
有关更多信息,请参阅维基百科上的生日问题,其中包含公式和近似值。
不同随机数据上的两个 CRC64 相同的概率接近 2** 64 中的 1 个机会。 但是,由于CRC对数据模式有些敏感,因此可能会出现退化的情况,即您将失去几个二进制保护顺序。 可能不可能想出一个硬数字,但你可以安全地假设最坏的碰撞几率是 1 分之 2** 50 左右。
如果您使用加密哈希而不是 CRC64,您可以放心接近理论极限,但加密哈希的计算成本通常要高得多。