我的.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机器上运行。它与this online hash calculator的预期输出匹配:
public void CalculateMd5Hash_CalculatesHashCorrectly()
{
var hash = HashingUtility.CalculateMd5Hash("CreateMD5Hash_123_!£$%^&*");
Assert.Equal("9a3e6e29cc3d1eae7d7a0df0a24a1deb", hash);
}
问题是该测试在运行于Linux机器上的CI管道中失败,但是我有点觉得这没有什么区别,因为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();
}
}
答案 0 :(得分:0)
正如@JeroenMostert在评论中建议的那样,似乎£
之后非ASCII字符git clone
丢失了,因此,这与C#代码UTF无关(我希望)。 -8或哈希函数。
我在这里对此提出了另外一个问题:Git messes up with non-ascii characters on Linux container