В моем приложении .Net Core (v2.x) есть очень простая функция, которая вычисляет хеш строки.Код выглядит следующим образом:
using System.Security.Cryptography;
using System.Text;
public static string CalculateMd5Hash(string input)
{
using (var md5 = MD5.Create())
{
var inputBytes = Encoding.UTF8.GetBytes(input);
var hashBytes = md5.ComputeHash(inputBytes);
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
}
}
Я также написал довольно простой тест для него, и, похоже, он работает на моей машине с Windows.Он соответствует ожидаемому результату этого онлайн-хеш-калькулятора :
public void CalculateMd5Hash_CalculatesHashCorrectly()
{
var hash = HashingUtility.CalculateMd5Hash("CreateMD5Hash_123_!£$%^&*");
Assert.Equal("9a3e6e29cc3d1eae7d7a0df0a24a1deb", hash);
}
Проблема в том, что этот тест не пройден в нашем конвейере CI, который работает на машине с Linux, но я вроде какэто не должно иметь никакого значения, поскольку UTF-8 и шестнадцатеричные строки являются независимыми от платформы понятиями.
Expected: 9a3e6e29cc3d1eae7d7a0df0a24a1deb
Actual: fb5f4b930ea2b600c6b976b954a56189
Любые идеи, что здесь происходит?
РЕДАКТИРОВАТЬ: я пытался что @DavidG предложил, но без удачи, точно такой же результат.Вот обновленная версия хэш-функции:
public static string CalculateMd5Hash(string input)
{
using (var md5 = MD5.Create())
{
var inputBytes = Encoding.UTF8.GetBytes(input);
var hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes .Length; i++)
{
sb.Append(hashBytes [i].ToString("X2"));
}
return sb.ToString().ToLower();
}
}