c# - DotNet Core - 加密哈希函数返回不一致的结果

标签 c# hash .net-core md5

我的 .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);
}

问题是这个测试在我们的 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();
    }
}

最佳答案

正如@JeroenMostert 在评论中建议的那样,似乎非 ascii 字符 £git clone 之后丢失了,因此这无关紧要(正如我所希望的那样) 使用 C# 代码、UTF-8 或哈希函数。

我在这里问了一个单独的问题:Git messes up with non-ascii characters on Linux container

关于c# - DotNet Core - 加密哈希函数返回不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56886433/

相关文章:

javascript - 如何在通过 Ajax.ActionLink 调用的动态加载的 ASP.NET MVC 部分 View 上初始化 jsTree

c - 使用 XOR 按位运算执行逐字节比较

c# - 为池中的每个连接设置 MySql session 变量

c# - 将 .NET Core 与旧版 .NET 框架 dll 结合使用

c# - C# 中的一些奇怪的东西 - UInt32 与 Int32

c# - 如何在不知道 T 是什么的情况下将 T 类型的项目添加到 List<T>?

C#串口读取错误

java - 为什么我的密码与编码的密码不匹配?

php - MySQL 表中的 64 位密码哈希

c# - .NET Core DI,为包注册默认实现