【问题标题】:Produce a Hash String of Fixed Length生成固定长度的哈希字符串
【发布时间】:2018-11-09 11:48:46
【问题描述】:

我想生成一个固定长度的散列字符串。我为此使用MessageDigest API。我注意到 API 中的 this 函数,但它返回一个整数而不是字节数组。

当我尝试使用这种重载的摘要方法时,我得到一个 java.security.DigestException: SHA-256 摘要的长度必须至少为 32 或输出缓冲区对于指定的偏移量和长度来说太小了。

有人可以举例说明如何生成固定长度的哈希值吗?

【问题讨论】:

  • 你真正想要达到什么目的?如果您编辑问题并添加不起作用的代码,它也会有所帮助。
  • 如果您想要更短的内容,请使用从 API 返回的摘要中的第一个或最后 n 个字节。
  • 该方法的文档(您发布的链接)明确指出“buf - 计算摘要的输出缓冲区”,返回的整数只是字节数。您必须传递将由该方法填充的足够大的字节数组(空)。还有其他方法可用,例如digest
  • 请同时发布您尝试过但不起作用的代码

标签: java


【解决方案1】:

您可以使用Commons Codec DigestUtils 生成哈希的十六进制表示。有几种算法可用:

例如

String input = "Hello World";
String sha1 = DigestUtils.sha1Hex(input);
System.out.println(sha1); // 0a4d55a8d778e5022fab701977c5d840bbc486d0

【讨论】:

    【解决方案2】:

    可以这样实现:

    import javax.xml.bind.DatatypeConverter;
    import java.nio.charset.StandardCharsets;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class TestA {
    
        public static void main(String [] args) throws Exception {
            String input = "Hello World";
            System.out.println(DatatypeConverter.printHexBinary(hashBytes(input.getBytes(StandardCharsets.UTF_8))));
        }
    
        public static byte[] hashBytes(byte [] bytes) throws NoSuchAlgorithmException {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(bytes);
            return md.digest();
        }
    }
    

    SHA-256当然可以用来代替SHA-1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-07
      • 2011-02-05
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 2021-03-15
      • 2018-08-08
      相关资源
      最近更新 更多