相同输入的Java不同MD5输出?

相同输入的Java不同MD5输出?,java,cryptography,md5,Java,Cryptography,Md5,我生成md5的代码如下所示 @Nonnull static String getAuthCode(@Nonnull final String email, @Nonnull final String memberExternalId, @Nonnull final String clientId, @Nonnull final String clientSecret) { final MessageDigest messageDiges

我生成md5的代码如下所示

@Nonnull
static String getAuthCode(@Nonnull final String email, @Nonnull final String memberExternalId,
                          @Nonnull final String clientId, @Nonnull final String clientSecret) {
    final MessageDigest messageDigest = getMessageDigest("MD5");
    final String stringForHashCode = email + ":" + memberExternalId + ":" + clientId + ":" + clientSecret;
    messageDigest.update(stringForHashCode.getBytes());
    return new BigInteger(1, messageDigest.digest()).toString();
}
我以同样的方式运行测试

@Test
public void test() {
    System.out.println(getAuthCode("a", "b", "c", "d"));
}
我得到的输出是

306937959255909402080036399104389354327
e6ea19c62a3763c7b78c475652c51357 
当我在线运行相同的测试时,我得到的输出是

306937959255909402080036399104389354327
e6ea19c62a3763c7b78c475652c51357 
对于相同的输入
a:b:c:d

问题

  • 为什么它们不同
  • 如何获得类似于在线获得的输出?哪个是
    e6ea19c62a3763c7b78c475652c51357

    • 评论中指出的问题是一个问题-您应该定义要使用的编码。我建议使用UTF-8,例如

      messageDigest.update(stringForHashCode.getBytes(StandardCharsets.UTF_8));
      
      然而,一个更大的问题是,您正在打印一个从摘要创建的
      biginger
      ——它是以十进制打印出来的。从在线工具得到的结果是十六进制的


      虽然您可以将
      biginger
      转换为十六进制,但我个人首先会避免创建
      biginger
      ——您需要计算填充等。相反,只需使用可用于将
      字节[]
      转换为十六进制的众多库中的一个,例如,与它的类一起。

      messageDigest.update(stringForHashCode.getBytes());
      不确定什么编码会给我类似于我在网上得到的结果我甚至尝试了
      messageDigest.update(stringForHashCode.getBytes(Charset.forName(“UTF-8”));
      但结果仍然是相同的
      Hashing.md5()。hashString(str,UTF_8)。toString()
      也打印出十六进制。