我需要计算一个字符串的哈希码并将其存储到一个'长'变量中。生成长MD5或SHA1哈希码(64位)
MD5和SHA1产生的散列码长于64位(MD5 - 128位,SHA1 - 160位)。
想法任何一个?
干杯,
多伦
我需要计算一个字符串的哈希码并将其存储到一个'长'变量中。生成长MD5或SHA1哈希码(64位)
MD5和SHA1产生的散列码长于64位(MD5 - 128位,SHA1 - 160位)。
想法任何一个?
干杯,
多伦
您可以截断哈希和使用只是第64位。哈希将稍微不那么强壮,但前64位仍然极有可能是唯一的。
对于散列的大多数用途来说,这是一种常见且完全可以接受的做法。
您还可以将完整散列存储为两个64位整数。
请注意,如果安全性很重要,MD5被认为是一个非常糟糕的选择。尽管存储非秘密数据的哈希值仍然很好。 – 2011-02-16 16:09:10
将这些位异或?例如。对于MD5,位0-63,异或位64-127,瞧,64位。这会给你一个较弱的散列,检查你是否可以接受。
(还,除非你的环境是非常限制 - 例如嵌入式设备 - 还有的“你为什么需要缩短了吗?”一题)
的FNV Hash是很容易实现。我们将其扩展到64位,它工作得很好。使用它比计算MD5或SHA1快得多,然后截断结果。但是,我们并不依赖它来获取密码函数 - 仅用于散列表等。在FNV
更多信息,与源代码和详细的解释:http://isthe.com/chongo/tech/comp/fnv/
您也可以播放各种的哈希算法与FooBabel Hasher
我使用这个(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;
}
}
由于前64位与后64位之间的异或而导致冲突的概率是多少?
一个想法:不。你为什么认为你需要这样做? – 2011-02-16 16:29:24
@larsmans可能是因为他们希望将它用作非加密散列作为弱检查,以确保它们不会生成多个相同的事物,并且不希望存储大量128位字符的十六进制字符串,有点哈希。 – 2014-06-13 11:30:15