2011-02-16 89 views
4

我需要计算一个字符串的哈希码并将其存储到一个'长'变量中。生成长MD5或SHA1哈希码(64位)

MD5和SHA1产生的散列码长于64位(MD5 - 128位,SHA1 - 160位)。

想法任何一个?

干杯,

多伦

+2

一个想法:不。你为什么认为你需要这样做? – 2011-02-16 16:29:24

+0

@larsmans可能是因为他们希望将它用作非加密散列作为弱检查,以确保它们不会生成多个相同的事物,并且不希望存储大量128位字符的十六进制字符串,有点哈希。 – 2014-06-13 11:30:15

回答

3

您可以截断哈希和使用只是第64位。哈希将稍微不那么强壮,但前64位仍然极有可能是唯一的。

对于散列的大多数用途来说,这是一种常见且完全可以接受的做法。

您还可以将完整散列存储为两个64位整数。

+1

请注意,如果安全性很重要,MD5被认为是一个非常糟糕的选择。尽管存储非秘密数据的哈希值仍然很好。 – 2011-02-16 16:09:10

0

将这些位异或?例如。对于MD5,位0-63,异或位64-127,瞧,64位。这会给你一个较弱的散列,检查你是否可以接受。

(还,除非你的环境是非常限制 - 例如嵌入式设备 - 还有的“你为什么需要缩短了吗?”一题)

1

FNV Hash是很容易实现。我们将其扩展到64位,它工作得很好。使用它比计算MD5或SHA1快得多,然后截断结果。但是,我们并不依赖它来获取密码函数 - 仅用于散列表等。在FNV

更多信息,与源代码和详细的解释:http://isthe.com/chongo/tech/comp/fnv/

0

您也可以播放各种的哈希算法与FooBabel Hasher

1

我使用这个(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; 
    } 
} 
0

由于前64位与后64位之间的异或而导致冲突的概率是多少?