【问题标题】:MD5 format in Java [duplicate]Java中的MD5格式[重复]
【发布时间】:2011-04-07 08:35:16
【问题描述】:

可能重复:
Generate MD5 hash in Java

谁能告诉我如何在 Java 中将字符串转换为 MD5 格式?

我有这样的代码,但我想要 32 个字符的 MD5 格式。

UUID uuid = UUID.randomUUID();
String token = uuid.toString().substring(0,12);

【问题讨论】:

标签: java md5


【解决方案1】:

实施

import java.security.MessageDigest;
import java.math.BigInteger;
import java.lang.String

public class SecurityUtil {

  public static String stringToMD5(String string) throws NoSuchAlgorithmException {

    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    messageDigest.update(string.getBytes(Charset.forName("UTF-8")),0,string.length());
    return new BigInteger(1,messageDigest.digest()).toString(16);
  }
}

用法:

  System.out.println(String.format("MD5: %s", stringToMD5("P@$$\\/\\/R|)")));

输出:

MD5: 91162629d258a876ee994e9233b2ad87*

在此示例中使用了编码 UTF-8。

What is Charset ?
What is MessageDigest ?
What is UTF-8 >

*md5 是来自 Wikipedia 的示例。

【讨论】:

  • 是否值得在调用String.getBytes()时指定编码?
【解决方案2】:

我又无聊了……

/**
 * @author BjornS
 * @created 2. sep. 2010
 */
public enum HashUtil {

    SHA1("SHA1"), MD5("MD5"), MD2("MD2"), SHA256("SHA-256"), SHA384("SHA-384"), SHA512("SHA-512");

    private final MessageDigest digester;

    HashUtil(String algorithm) {
        try {
            digester = MessageDigest.getInstance(algorithm);
            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException(e.getMessage(), e);
        }
    }

    public String hash(byte[] in) {
        return toHexString(digester.digest(in));
    }

    public String hash(String in) {
    return hash(in.getBytes());
    }

    public String hash(String in, Charset characterSet) {
        return hash(in.getBytes(characterSet));
    }

    public byte[] hashToByteArray(String in) {
        return digester.digest(in.getBytes());
    }

    public byte[] hashToByteArray(String in, Charset characterSet) {
        return digester.digest(in.getBytes(characterSet));
    }

    public byte[] hashToByteArray(byte[] in) {
        return digester.digest(in);
    }

    private String toHexString(byte[] digest) {
        StringBuffer hexStr = new StringBuffer(40);
        for (byte b : digest) {
            hexStr.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        }
        return hexStr.toString();
    }

}

-

/*** ***/
// Use Charsets from Google Guava rather than manually code the charset request, you also don't have to catch exceptions this way! :)

pulic static void main(String... args) {
    UUID uuid = UUID.randomUUID();
    String uuidString = uuid.toString().substring(0,12);
    String token = HashUtil.MD5.hash(uuidString,Charsets.UTF_8);
}

【讨论】:

  • 您错过了有关其他答案的字符编码的 cmets?我会将其修复为 UTF-8(如果您的应用程序已经为统治世界而设计)或至少将其作为方法参数传递。
  • 我想我做到了。可以将其添加为哈希方法的可选参数。
【解决方案3】:

这对我有用..

UUID uuid = UUID.randomUUID();
String token = MD5.digest(uuid.toString().substring(0,12));

感谢所有回答的家伙。

【讨论】:

  • 如果结果不依赖于输入(即必须计算 MD5 的字符串),这如何工作?
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多