我想将短文本(即单词,几个单词)表示为64位哈希(希望将它们存储为长整数)
MessageDigest.getInstance(“MD5”)返回128位。
还有什么我可以使用的,我可以剥掉一半吗?我并不担心有人试图复制哈希,我想尽量减少冲突的数量(两个不同的字符串具有相同的哈希值)
答案 0 :(得分:2)
MD5(和SHA)散列在散列值上以统一的方式“涂抹”数据,因此任何64位ypu选择超出最终值将对任何其他64位的变化敏感。您唯一关心的是碰撞概率的增加。
答案 1 :(得分:2)
您可以使用MD5哈希的任何部分。
我们尝试使用各种算法将128位折叠成64位,但折叠操作在散列分布方面没有任何显着差异。
为什么不使用String的hashCode()?我们将800万个电子邮件地址转换为32位整数,实际上与MD5的冲突比String hashCode更多。您可以运行hashCode两次(向前和向后)并使其长度为64位。
答案 2 :(得分:1)
您可以从128位散列中获取64位的采样。你不能保证不会发生冲突 - 只有一个完美的哈希会给你这个,并且对于任意长度的字符串没有完美的哈希值)但是冲突的可能性非常小。
除了采样之外,您还可以使用更复杂的函数派生哈希值,例如XOR连续位对。
答案 3 :(得分:1)
作为加密哈希(即使现在被认为已破解),MD5在输入和输出位之间没有显着的相关性。这意味着,简单地采用第一个或后一个将为您提供完美分布的哈希函数。其他任何东西都不会被认真地视为加密哈希。
答案 4 :(得分:0)
使用64位块大小的块密码怎么样?