Я знаю, что эта тема старая, но я столкнулся с той же проблемой только сейчас и не смог найти ответ, который работал для меня. Я писал патчер для игры, и мне нужно было md5
hashcode
файлов, чтобы гарантировать, что файлы обновлены, но C # и Java дали мне разные строки, хотя файлы были идентичны.
Вот как я это решил:
C # Код:
public static string getMD5(string fullPath)
{
MD5 md5 = MD5.Create();
using (FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
byte[] hash = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int j = 0; j < hash.Length; j++)
{
sb.Append(hash[j].ToString("X2"));
}
return sb.ToString();
}
}
Это создает шестнадцатеричную строку из 32 символов. Apache Commons
DigestUtils.md5Hex(InputStream)
делает то же самое, теперь единственное отличие состоит в том, что пример C # возвращает строку в верхнем регистре, поэтому решение заключается в простом преобразовании хэша из программы Java в строку в верхнем регистре. *
Java-код:
public static String checkSumApacheCommons(String filePath)
{
String checksum = null;
try
{
checksum = DigestUtils.md5Hex(new FileInputStream(filePath));
}
catch (IOException ex)
{
ex.printStackTrace(System.out);
}
return checksum.toUpperCase();
}
Полученные хэши выглядят как F674865D8A44695A2443017CFA2B0C67
.
Надеюсь, это кому-нибудь поможет.