C # эквивалент Java DigestUtils.md5Hex (String)? - PullRequest
1 голос
/ 09 октября 2009

Есть ли готовый C #, эквивалентный Java DigestUtils .md5Hex (String)? Мой Java ржавый, но я могу сказать, что DigestUtils является частью пакета кодека Apache Commons, а метод md5Hex (String) по существу использует MessageDigest.getInstance ("MD5").

(Один связанный бит, и код Java, и код C # используют UTF8.)


В простейших тестах я исключил разницу между алгоритмами Java и C #, которые я использую. Это означает, что моя проблема в другом месте. Но, к сведению, эти два фрагмента кода дают одинаковые результаты: (Спасибо, Алекс.)

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 символов, используя первый аргумент в качестве данных для форматирования. К сожалению, разработчик, который написал ошибку, здесь больше не работает, что лишает меня возможности обхватить руками его горло.

1 Ответ

3 голосов
/ 09 октября 2009

Хотите вычислить md5 в c #?

System.Security.Cryptography.MD5CryptoServiceProvider x =
    new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(password);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
   s.Append(b.ToString("x2").ToLower());
}
password = s.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...