【问题标题】:Produce MD5 or SHA1 hash code to long (64 bits)将 MD5 或 SHA1 哈希码生成长(64 位)
【发布时间】:2011-06-28 11:17:45
【问题描述】:

我需要计算一个字符串的哈希码并将其存储到一个“长”变量中。

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

有什么想法吗?

干杯,

多伦

【问题讨论】:

  • 一个想法:不要。为什么你认为你需要这样做?
  • @larsmans 可能是因为他们想将其用作非加密哈希作为弱检查,以确保他们不会生成多个相同的东西,并且不想存储很多128 位哈希的十六进制字符串。
  • 这是一个很好的方法,用于合成集群键(当您不想存储长用户 ID 时)或在数据库驱动程序文件系统中存储文件哈希。通过存储文件的短哈希值来绝对加速重复检测。我什至会根据文件的前 N ​​个字节存储一系列哈希,并为文件的后 N 个字节存储另一个哈希。

标签: algorithm hash cryptography md5 sha1


【解决方案1】:

您可以截断散列并仅使用前 64 位。哈希值会稍微弱一些,但前 64 位仍然极有可能是唯一的。

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

您还可以将完整的哈希存储在两个 64 位整数中。

【讨论】:

  • 请注意,如果安全性很重要,MD5 被认为是一个非常糟糕的选择。不过,存储非机密数据的哈希值仍然很好。
  • 我不同意“对于哈希的大多数用途,这是一种常见且完全可以接受的做法。”。安全散列经常用于 64 位散列由于安全或冲突率原因而无法接受的情况。
  • @NickJohnson:很抱歉回复晚了(几年了?)。确实,安全散列应该超过 64 位,等等。请注意,我说的是“大多数情况下使用散列”——根据我的经验,当许多基本数据结构出于性能原因使用散列时,安全散列只是杯水车薪。
【解决方案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;
    }
}

【讨论】:

    【解决方案3】:

    FNV Hash 很容易实现。我们将它扩展到 64 位,它运行良好。使用它比计算 MD5 或 SHA1 然后截断结果要快得多。但是,我们并不依赖它来实现加密功能——仅用于哈希表等。

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

    【讨论】:

      【解决方案4】:

      XOR 位在一起?例如。对于 MD5,位 0-63 XOR 位 64-127,瞧,64 位。这会给你一个较弱的哈希,检查你是否可以接受。

      (此外,除非您的环境极度受到限制 - 例如嵌入式设备 - 有一个问题是“为什么您需要缩短它?”)

      【讨论】:

      • 无需对位进行异或运算 - 在安全哈希中,任何子集都足够了。
      【解决方案5】:

      您还可以使用 FooBabel Hasher 玩各种哈希算法

      【讨论】:

        【解决方案6】:

        前 64 位和后 64 位之间的 XOR 导致冲突的概率是多少?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-17
          • 2011-08-16
          • 2011-12-16
          • 1970-01-01
          • 2010-12-08
          • 1970-01-01
          • 2013-03-05
          • 2014-02-07
          相关资源
          最近更新 更多