翼度科技»论坛 编程开发 .net 查看内容

.net core中你的MD5用对了吗?

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
本文的项目环境为 .net 6.0 (.net 5.0 以上都支持)
在 .net 中获取字符串的 MD5 相信是非常容易的事情吧, 但是随便在网上搜一搜发现流传的版本还不少呢,比如:

  • StringBuilder 版本(应该算是官方版本了,使用的人最多,我发现在 ABP 中也是使用的这个)
  • BitConverter 版本
  • StringConcat 版本 (字符串拼接,用的人很少,估计都知道性能不好)
但是它们是否是最佳实现? 我们来测试一下
StringBuilder 版本
  1. public static string Md5_StringBuilder(string input)
  2. {
  3.     using var md5 = MD5.Create();
  4.     var inputBytes = Encoding.UTF8.GetBytes(input);
  5.     var hashBytes = md5.ComputeHash(inputBytes);
  6.     var sb = new StringBuilder();
  7.     foreach (var hashByte in hashBytes)
  8.     {
  9.         sb.Append(hashByte.ToString("X2"));
  10.     }
  11.     return sb.ToString();
  12. }
复制代码
BitConverter 版本
  1. public static string Md5_BitConverter(string input)
  2. {
  3.     using var md5 = MD5.Create();
  4.     var inputBytes = Encoding.UTF8.GetBytes(input);
  5.     var hashBytes = md5.ComputeHash(inputBytes);
  6.     return BitConverter.ToString(hashBytes).Replace("-", "");
  7. }
复制代码
StringConcat 版本
  1. public static string Md5_StringConcat(string input)
  2. {
  3.     using var md5 = MD5.Create();
  4.     var inputBytes = Encoding.UTF8.GetBytes(input);
  5.     var hashBytes = md5.ComputeHash(inputBytes);
  6.     var output = string.Empty;
  7.     foreach (var hashByte in hashBytes)
  8.     {
  9.         output += hashByte.ToString("X2");
  10.     }
  11.     return output;
  12. }
复制代码
性能对比

先上我测试得到的数据(本机配置: 4 核 8 线程, 测试结果可能不一致)

Benchmark


看结果,的确是字符串拼接性能最差,但是 StringBuilder 好像也不是很高效啊,那个什么 Static 是啥玩意,怎么性能这么好,相对于 StringBuilder, 单线程性能提高了 3 倍, 多线性提高了 5 倍???
没错,这就是我要说的, 从 .net 5.0 开始提供了 2 个非常高效的方法

  • Convert.ToHexString
  • MD5.HashData
Convert.ToHexString 实例版本
  1. public static string MD5_HexConvert_Instance(string input)
  2. {
  3.     using var md5 = MD5.Create();
  4.     var inputBytes = Encoding.UTF8.GetBytes(input);
  5.     var hashBytes = md5.ComputeHash(inputBytes);
  6.     return Convert.ToHexString(hashBytes);
  7. }
复制代码
MD5.HashData 静态版本(强烈建议)
  1. public static string MD5_HexConvert_Static(string input)
  2. {
  3.     var inputBytes = Encoding.UTF8.GetBytes(input);
  4.     var hashBytes = MD5.HashData(inputBytes);
  5.     return Convert.ToHexString(hashBytes);
  6. }
复制代码
总结


  • 强烈建议 使用 MD5.HashData + Convert.ToHexString, 代码性能最高,也最简洁,只有 3 行
  • 一定不要 忘记释放 MD5,我看网上很多在使用实例版本 MD5.Create() 后都没有 Dispose, 这会导致 内存泄漏!!!
最后放上我的完整的测试代码
  1. using BenchmarkDotNet.Attributes;
  2. using BenchmarkDotNet.Jobs;
  3. using BenchmarkDotNet.Running;
  4. using System.Text;
  5. using System.Security.Cryptography;
  6. namespace ConsoleTest;
  7. [SimpleJob(RuntimeMoniker.Net60)]
  8. [MemoryDiagnoser(true)]
  9. public class MD5_BenchMarks
  10. {
  11.     [Params(10_0000)]
  12.     public int Size { get; set; }
  13.     [Benchmark]
  14.     [Arguments("123456")]
  15.     public string Md5_StringBuilder(string input)
  16.     {
  17.         using var md5 = MD5.Create();
  18.         var inputBytes = Encoding.UTF8.GetBytes(input);
  19.         var hashBytes = md5.ComputeHash(inputBytes);
  20.         var sb = new StringBuilder();
  21.         foreach (var hashByte in hashBytes)
  22.         {
  23.             sb.Append(hashByte.ToString("X2"));
  24.         }
  25.         return sb.ToString();
  26.     }
  27.     [Benchmark]
  28.     [Arguments("123456")]
  29.     public string Md5_StringConcat(string input)
  30.     {
  31.         using var md5 = MD5.Create();
  32.         var inputBytes = Encoding.UTF8.GetBytes(input);
  33.         var hashBytes = md5.ComputeHash(inputBytes);
  34.         var output = string.Empty;
  35.         foreach (var hashByte in hashBytes)
  36.         {
  37.             output += hashByte.ToString("X2");
  38.         }
  39.         return output;
  40.     }
  41.     [Benchmark]
  42.     [Arguments("123456")]
  43.     public string Md5_BitConverter(string input)
  44.     {
  45.         using var md5 = MD5.Create();
  46.         var inputBytes = Encoding.UTF8.GetBytes(input);
  47.         var hashBytes = md5.ComputeHash(inputBytes);
  48.         return BitConverter.ToString(hashBytes).Replace("-", "");
  49.     }
  50.     [Benchmark]
  51.     [Arguments("123456")]
  52.     public string MD5_HexConvert_Instance(string input)
  53.     {
  54.         using var md5 = MD5.Create();
  55.         var inputBytes = Encoding.UTF8.GetBytes(input);
  56.         var hashBytes = md5.ComputeHash(inputBytes);
  57.         return Convert.ToHexString(hashBytes);
  58.     }
  59.     [Benchmark]
  60.     [Arguments("123456")]
  61.     public string MD5_HexConvert_Static(string input)
  62.     {
  63.         var inputBytes = Encoding.UTF8.GetBytes(input);
  64.         var hashBytes = MD5.HashData(inputBytes);
  65.         return Convert.ToHexString(hashBytes);
  66.     }
  67. }
  68. class Program
  69. {
  70.     static void Main()
  71.     {
  72.         BenchmarkRunner.Run(typeof(MD5_BenchMarks));
  73.         Console.ReadKey();
  74.     }
  75. }
复制代码
来源:https://www.cnblogs.com/broadm/archive/2023/10/26/17789951.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具