经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.net core中你的MD5用对了吗?
来源:cnblogs  作者:Broadm  时间:2023/10/30 9:18:30  对本文有异议

本文的项目环境为 .net 6.0 (.net 5.0 以上都支持)

在 .net 中获取字符串的 MD5 相信是非常容易的事情吧, 但是随便在网上搜一搜发现流传的版本还不少呢,比如:

  1. StringBuilder 版本(应该算是官方版本了,使用的人最多,我发现在 ABP 中也是使用的这个)

  2. BitConverter 版本

  3. 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 线程, 测试结果可能不一致)

image

Benchmark

image

看结果,的确是字符串拼接性能最差,但是 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/p/17789951.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号