gpt4 book ai didi

php - 加快我在 MySQL 中的索引 - CRC 或 MD5?

转载 作者:可可西里 更新时间:2023-11-01 07:02:50 30 4
gpt4 key购买 nike

我有一个巨大的表格,大约有 8 300 000 行(永远不会被编辑或删除)。

我的第一列看起来类似于 P300-4312B_X16_S 并且条目不是唯一的,因此我在此字段上使用常规索引。

但是,MySQL 使用二进制字段而不是 varchar 的速度要快得多,因此我使用 BINARY(16) 在 MD5 中对我的索引进行编码以存储数据。

今天早上,我第一次开始使用 CRC32,我看到 CRC32 可以输出为使用 8 个字符的十六进制字符串。

我的问题:如果我使用 CRC32 而不是 MD5,它会更快。但是,当运行 CRC32 时,让我们说 2 000 000 个唯一值,结果将是唯一的,或者也许有时我会有两倍相同的字符串用于两个不同的字符串?我问这个是因为结果只有 8 个字符 (32b) 长,而不是像 MD5 那样的 32(128b)。

谢谢。

最佳答案

预期的碰撞次数是对的数量超过可能的检查值的数量。因此,对于 2,000,000 个值,有 (2000000 * 1999999)/2 对,大约是 2x1012。对于 32 位 CRC,预期的冲突次数超过 232,即 466。因此在这种情况下基本上可以保证发生冲突。

对于 128 位 MD5 校验值,预期的冲突次数约为 6x10-27。对于较小的预期值,这也是一次碰撞的概率。

如果碰撞概率非常低对您很重要,那么您需要选择 CRC-32 以外的其他东西。

虽然您不需要 MD5 的开销,因为它的加密强度对于您的应用程序并不重要。你真的不在乎恶意的人是否能找到一种方法来伪造一个与另一个条目具有相同校验值的条目。因此,您可以使用为此目的设计的 64 位非加密散列,它运行得更快,并且在您的 2,000,000 个值的情况下会产生 10-7 的冲突概率。或者您可以使用 128 位非加密散列并获得与 MD5 相同的概率,但速度要快得多。看看 CityHash family哈希算法。

但是请注意,在所有情况下发生碰撞的概率都不是零。您应该考虑代码冲突的后果。

关于php - 加快我在 MySQL 中的索引 - CRC 或 MD5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678589/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com