生成长(64位)的MD5或SHA1哈希码

时间:2011-02-16 15:59:33

标签: algorithm hash cryptography md5 sha1

我需要计算字符串的哈希码并将其存储到'long'变量中。

MD5和SHA1产生的哈希码长度超过64位(MD5 - 128位,SHA1 - 160位)。

任何人的想法?

干杯,

多伦

6 个答案:

答案 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,碰撞的概率是多少?