我需要计算字符串的哈希码并将其存储到'long'变量中。
MD5和SHA1产生的哈希码长度超过64位(MD5 - 128位,SHA1 - 160位)。
任何人的想法?
干杯,
多伦
答案 0 :(得分:4)
您可以截断哈希并仅使用前64位。哈希值会稍微强一些,但前64位仍然极不可能是唯一的。
对于哈希的大多数用途,这是一种常见且完全可以接受的做法。
您还可以将完整哈希存储在两个64位整数中。
答案 1 :(得分:2)
我正在使用这个(Java):
public class SimpleLongHash {
final MessageDigest md;
//
public SimpleLongHash() throws NoSuchAlgorithmException {
md = MessageDigest.getInstance("MD5");
}
//
public long hash(final String str) {
return hash(str.getBytes());
}
public long hash(final byte[] buf) {
md.reset();
final byte[] digest = md.digest(buf);
return (getLong(digest, 0) ^ getLong(digest, 8));
}
//
private static final long getLong(final byte[] array, final int offset) {
long value = 0;
for (int i = 0; i < 8; i++) {
value = ((value << 8) | (array[offset+i] & 0xFF));
}
return value;
}
}
答案 2 :(得分:1)
FNV Hash很容易实现。我们将它扩展到64位,效果非常好。使用它比计算MD5或SHA1快得多,然后截断结果。但是,我们不依赖于加密函数 - 仅用于哈希表等。
有关FNV的更多信息,包含源代码和详细说明:http://isthe.com/chongo/tech/comp/fnv/
答案 3 :(得分:0)
将这些位异或一起?例如。对于MD5,位0-63 XOR位64-127,瞧,64位。这会给你一个较弱的哈希值,检查一下你是否可以接受。
(另外,除非您的环境受到极度约束 - 例如嵌入式设备 - 否则会出现“为什么需要缩短它?”的问题。)
答案 4 :(得分:0)
您还可以使用FooBabel Hasher
使用各种哈希算法答案 5 :(得分:0)
由于前64位和后64位之间的XOR,碰撞的概率是多少?