我正在寻找一些数据对象的32位哈希值。由于我不想编写自己的哈希函数并且md5可用,我目前的方法是使用md5哈希中的前32位(即前8个十六进制数字)。这可以接受吗?
换句话说,md5哈希的前32位是否与任何其他子字符串一样“随机”?或者是否有任何理由我更喜欢,比如最后32位?或者可能将四个32位子串一起异或?
一些先发制人的澄清:
答案 0 :(得分:11)
对于任何良好的散列函数,各个位应该近似随机。因此,您应该可以安全地仅使用MD5哈希的前32位。
或者您也可以使用CRC32,它的计算速度要快得多(代码大约为20行)。
答案 1 :(得分:9)
换句话说,是前32位 一个md5哈希就像任何“随机”一样 其他子串?
是。如果答案是否定的,MD5将不够安全。 (当然,它有一些较小的加密缺点,但我不知道有任何统计缺陷)
答案 2 :(得分:1)
这是一个老问题,但经常出现。答案肯定是NO,否则MD5字符串不需要超过32位长。
无论如何,MD5字符串根本不是随机的 - 它在相同的输入下完全且一致地可重现(这几乎是反随机的;-))。
它是否足以满足您的目的取决于您的目的。