非加密散列算法的应用-MurmurHash
背景
目前有三代非加密散列算法
- 第1代:
lookup
- 第2代:
MurmurHash
- 第3代:
CityHash
、SpookyHash
,缺点是,只使用了64位数学函数而没有32位版本
MurmurHash性能测试
没有啥,直接上代码
// 大约400+MB
var data = File.ReadAllBytes(@"C:\Users\Administrator\Downloads\AxureRP-10.3924.zip");
using var murmur = MurmurHash.Create128();
using MD5 md5 = MD5.Create();
using SHA1 sha1 = SHA1.Create();
// 每种算法计算2次,模拟800+MB数据
int? count = 2;
// 计算耗时
Stopwatch watch1 = new Stopwatch();
Stopwatch watch2 = new Stopwatch();
Stopwatch watch3 = new Stopwatch();
watch1.Start();
count.For(i =>
{var hash = murmur.ComputeHash(data);
});
watch1.Stop();
watch2.Start();
count.For(i =>
{var hash = md5.ComputeHash(data);
});
watch2.Stop();
watch3.Start();
count.For(i =>
{var hash = sha1.ComputeHash(data);
});
watch3.Stop();
// 输出结果
Console.WriteLine($"[Mur] ComputeHash {count} Times:{watch1.ElapsedMilliseconds} ms");
Console.WriteLine($"[MD5] ComputeHash {count} Times:{watch2.ElapsedMilliseconds} ms");
Console.WriteLine($"[SHA] ComputeHash {count} Times:{watch3.ElapsedMilliseconds} ms");
运行效果:
总结
如果在不需要考虑安全性,只需要考虑过滤重复文件或者一些需要唯一性判断的条件下,可以使用非加密的散列hash算法相较于常见的MD5、SHA-1等,速度有明显的提升。