【发布时间】:2009-10-08 21:31:04
【问题描述】:
有没有现成的C#相当于Java的DigestUtils.md5Hex(String)?我的 Java 生锈了,但我可以说 DigestUtils 是 Apache Commons Codec 包的一部分,而 md5Hex(String) 方法本质上是使用 MessageDigest.getInstance("MD5")。
(一个相关的花絮,Java和C#代码都使用UTF8。)
在最简单的测试中,我已经排除了我使用的 Java 和 C# 算法之间的任何差异。这意味着我的问题在其他地方。但是,为了记录,这两段代码产生了相同的结果:(谢谢,Alex。)
Java:
private static void printMd5Hex(String data) {
System.out.println(DigestUtils.md5Hex(data));
}
C#:
private static void printMd5Hex(string data)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] dataHash = md5.ComputeHash(Encoding.UTF8.GetBytes(data));
StringBuilder sb = new StringBuilder();
foreach (byte b in dataHash)
{
sb.Append(b.ToString("x2").ToLower());
}
Console.WriteLine(sb.ToString());
}
为了正确解决这个问题,我的问题的根源与用于创建被散列的“数据”的格式字符串中的 Java 代码中的错误有关。本质上:
string dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s";
string dataToHash = String.Format(dataFormatString, ...);
问题在于第 12 个参数。它缺少一个 $,这意味着数据被空格填充到最少 12 个字符,使用第一个参数作为要格式化的数据。可悲的是,编写该错误的开发人员不再在这里工作,因此剥夺了我用手捂住他喉咙的机会。
【问题讨论】: