先来点题外话,清明节前把工做辞了(去 tm 的垃圾团队,各类拉帮结派、勾心斗角)。此次找工做就得慢慢找了,不能急了,但愿能找到个好团队,好岗位吧。顺便这段时间也算是比较闲,也能学习一下和填掉手上的坑。html
说实话很久没写博客了,一个是手上的工做确实忙,第二个是还有各类各样的坑。写本文的缘由也是由于手上的一个坑——ImageEx,WPF/UWP 上的图片缓存控件。算法
在我写的这个图片缓存控件中,其中有一个地方就是要根据图片的 url 地址,而后来存储或者获取本地的图片文件的。可是呢,咱们不可能把 url 看成本地文件的文件名的,一个是可能包含非法字符(如斜杠),另外一个是长度可能超出限制。想了一下,那就只能用哈希(hash)来解决了,其中 MD5 和 SHA1 两种算法我以为均可以解决这个问题。但问题是,哪个更好、更快呢?传统经验告诉我是 MD5,可是我以为仍是有必要手动实践一下,毕竟没有 100% 的把握。缓存
先编写出以下的代码:app
public static class HashHelper { public static string GetMD5(string input) { if (input == null) { throw new ArgumentNullException(nameof(input)); } using (var md5 = MD5.Create()) { var buffer = Encoding.UTF8.GetBytes(input); var hashResult = md5.ComputeHash(buffer); return BitConverter.ToString(hashResult).Replace("-", string.Empty); } } public static string GetSHA1(string input) { if (input == null) { throw new ArgumentNullException(nameof(input)); } using (var sha1 = SHA1.Create()) { var buffer = Encoding.UTF8.GetBytes(input); var hashResult = sha1.ComputeHash(buffer); return BitConverter.ToString(hashResult).Replace("-", string.Empty); } } }
做用是输入一个字符串,输出一个哈希后的字符串。性能
创建一个 .net core 的控制台项目,我就叫 TestBenchmarkDotnet。学习
而后安装 nuget 包,BenchmarkDotnet。测试
安装完成后编写以下代码:url
public class TestContext { [Benchmark] public void TestMD5() { HashHelper.GetMD5("https://www.baidu.com/img/bd_logo1.png"); } [Benchmark] public void TestSHA1() { HashHelper.GetSHA1("https://www.baidu.com/img/bd_logo1.png"); } }
而后修改 Main 方法:spa
public class Program { public static void Main(string[] args) { Summary summary = BenchmarkRunner.Run<TestContext>(); Console.ReadLine(); } }
最后将 Debug 调成 Release 模式,不调试启动。.net
稍微等待一下子就会出现结果了。
结论是 MD5 确实比 SHA1 快。
另外因为这是在 .net core 下的测试结果,而 WPF 是跑在 .net framework 下的,那么是否结果可能不同呢?
Benchmark 支持多个 .net 环境的性能测试(.net framework, net core, mono)。
修改 TestContext 类的代码:
[ClrJob, CoreJob] public class TestContext { [Benchmark] public void TestMD5() { HashHelper.GetMD5("https://www.baidu.com/img/bd_logo1.png"); } [Benchmark] public void TestSHA1() { HashHelper.GetSHA1("https://www.baidu.com/img/bd_logo1.png"); } }
添加了 ClrJob 和 CoreJob 两个标签
而后修改项目的 csproj 文件
将
<TargetFramework>netcoreapp2.0</TargetFramework>
一行改成
<TargetFrameworks>netcoreapp2.0;net471</TargetFrameworks>
回到 VS 从新编译,还原 nuget 包。
不调试启动。稍等片刻。
可见在 .net framework 环境下,仍然是 MD5 比 SHA1 快的。并且能够看见 .net core 比 .net framework 环境下快了不少。
另外在输出目录下,BenchmarkDotnet 会输出性能测试结果文件:
打开 html 版本后看到的跟刚才控制台的是同样的