c# - DotNet Core - 返回不一致结果的加密哈希函数
问题描述
我的 .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();
}
}
解决方案
正如@JeroenMostert 在评论中所建议的那样,似乎非ascii 字符£
在 之后丢失了git clone
,因此这与C# 代码、UTF-8 或哈希函数无关(如我所愿)。
我在这里问了一个单独的问题:Git messes up with non-ascii characters on Linux container
推荐阅读
- javascript - React:通过引用访问动态创建的元素的属性
- excel - 将所有工作表保存为 csvs 并保持原始文件处于活动状态
- javascript - 即使我在 html 中调用 cdn,我是否需要安装 plotly?
- excel - 我如何将这些数据从多行重新格式化为多列
- vb.net - 以表单形式获取当前 Outlook 窗口
- robotframework - 如何通过选择文件从 Mac 上传本地文件
- html - 如何在我的 HTML 页面上使用 reactjs 显示此 json 数据
- c# - 我是否必须连接到本地数据库才能使用它的表值?如何访问表值?
- android - java.lang.RuntimeException: 传递结果失败 ResultInfo{who=null, request=4, result=-1, data=Intent
- android - 每当我尝试运行我的 Flutter 应用程序时执行此任务的“app:transformClassesWithMultidexlistForDebug”