可以CRC32作为哈希函数? 任何缺点这种方法? 任何tradedeoffs?
Answer 1:
CRC32工作得非常好作为哈希算法。 一个CRC的整点是哈希字节流用尽可能少的冲突成为可能。 这就是说,都需要考虑几点:
CRC的是不安全的。 对于安全散列,你需要一个更昂贵的计算算法。 对于一个简单的水桶散列器,安全性通常是一个非问题。
不同口味的CRC具有不同特性的存在。 确保你使用正确的算法,例如用哈希多项式0x11EDC6F41(CRC32C),这是最佳的通用选择。
作为一个哈希速度/质量权衡,在x86指令CRC32是很难被击败。 然而,该指令不旧的CPU存在是如此提防的可移植性问题。
---- ----编辑
马克·阿德勒提供指向由布雷特·穆尔维的散列评估一个有用的文章。 使用本文提供的源代码,我跑了“水桶测试”既CRC32C和Jenkins96。 这些表显示,一个真正的均匀分布会比单独几率测量结果更坏的概率。 因此, 数字越大越好。 笔者认为0.05或更低的疲弱和0.01或更低是非常弱的。 我完全相信在这一切的作者,我只是报告结果。
我把一个*通过其中CRC32C比Jenkins96表现较好的所有实例。 通过这种简单帐簿,CRC32C是一个更加均匀的哈希比的96倍Jenkins96 54。 特别是如果你可以使用的x86指令CRC32,速度性能的权衡是优秀的。
CRC32C (0x1EDC6F41) Uniform keys Text keys Sparse keys Bits Lower Upper Lower Upper Lower Upper 1 0.671 *0.671 *1.000 0.120 *0.572 *0.572 2 *0.706 *0.165 *0.729 *0.919 0.277 0.440 3 *0.878 *0.879 *0.556 0.362 *0.535 *0.542 4 0.573 0.332 0.433 0.462 *0.855 0.393 5 0.023 *0.681 0.470 0.907 0.266 0.059 6 *0.145 *0.523 0.354 *0.172 *0.336 0.588 7 0.424 0.722 0.172 *0.736 0.184 *0.842 8 *0.767 0.507 *0.533 0.437 0.337 0.321 9 0.480 0.725 *0.753 *0.807 *0.618 0.025 10 *0.719 0.161 *0.970 *0.740 *0.789 0.344 11 *0.610 0.225 *0.849 *0.814 *0.854 *0.003 12 *0.979 *0.239 *0.709 0.786 0.171 *0.865 13 *0.515 0.395 0.192 0.600 0.869 *0.238 14 0.089 *0.609 0.055 *0.414 *0.286 *0.398 15 *0.372 *0.719 *0.944 0.100 *0.852 *0.300 16 0.015 *0.946 *0.467 0.459 0.372 *0.793
而对于Jenkins96,该文章的作者认为是一个很好的哈希:
Jenkins96 Uniform keys Text keys Sparse keys Bits Lower Upper Lower Upper Lower Upper 1 0.888 0.572 0.090 0.322 0.090 0.203 2 0.198 0.027 0.505 0.447 0.729 0.825 3 0.444 0.510 0.360 0.444 0.467 0.540 4 0.974 0.783 0.724 0.971 0.439 0.902 5 0.308 0.383 0.686 0.940 0.424 0.119 6 0.138 0.505 0.907 0.103 0.300 0.891 7 0.710 0.956 0.202 0.407 0.792 0.506 8 0.031 0.552 0.229 0.573 0.407 0.688 9 0.682 0.990 0.276 0.075 0.269 0.543 10 0.382 0.933 0.038 0.559 0.746 0.511 11 0.043 0.918 0.101 0.290 0.584 0.822 12 0.895 0.036 0.207 0.966 0.486 0.533 13 0.290 0.872 0.902 0.934 0.877 0.155 14 0.859 0.568 0.428 0.027 0.136 0.265 15 0.290 0.420 0.915 0.465 0.532 0.059 16 0.155 0.922 0.036 0.577 0.545 0.336
Answer 2:
很明显,你可以,但你不应该。 一个CRC32输入比特分配不佳的哈希值。 此外,它当然不能永远作为一个单向散列,因为它不是一个。 这是很容易修改的消息,产生一个给定的CRC。
使用专为您心目中的目的,不管它是什么哈希算法。
Answer 3:
我不知道为什么马克·阿德勒说,“CRC32不佳分配输入位散列”。 有一个在CRC32散列即正好等于输入位没有单个比特。 散列的任何位是输入比特的线性组合。 其次,CRC总是均匀地相同数量的输入序列的不同映射到给定的散列值。 例如,如果你有1000位长的消息,CRC32后,可以随时发现产生给定散列值,没有更多的,不低于2 ^(一○○○年至1032年)序列。
如果您不需要安全功能,CRC可以完美作为哈希值。
其实,我觉得其他非安全散列函数可能比CRC简单,如果你需要有一个较长的CRC,例如CRC-256。