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

时间:2012-10-01 18:07:20

标签: php mysql crc32

我有一张大桌子,有8 300 000行(不会被编辑也不会删除)。

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

但是,MySQL使用二进制字段而不是varchar更快,所以我使用BINARY(16)在MD5中编码我的INDEX来存储数据。

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

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

感谢。

1 个答案:

答案 0 :(得分:8)

预期的冲突数是可能的检查值数量对的数量。因此,对于2,000,000个值,存在(2000000 * 1999999)/ 2对,其为约2x10 12 。对于32位CRC,预期的冲突数量超过2 32 ,即466.因此,基本上保证在这种情况下发生冲突。

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

如果碰撞的可能性很小,那么你需要选择CRC-32以外的东西。

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

但请注意,在所有情况下,碰撞的概率都不为零。您应该考虑碰撞对代码的影响。