NET框架附带6种不同的哈希算法:
MD5:16个字节(散列时间500MB:1462毫秒)SHA-1:20个字节(1644毫秒)SHA256:32个字节(5618毫秒)SHA384:48个字节(3839毫秒)SHA512:64个字节(3820毫秒)RIPEMD:20个字节(7066 ms)这些功能的执行方式各不相同;MD5是最快的,而RIPEMD是最慢的。
MD5的优点是适合内置的Guid类型。它是类型3 UUID的基础。SHA-1哈希是类型5 UUID的基础。这使得它们真正易于识别。
但是,MD5容易受到碰撞攻击,SHA-1也容易受到攻击,但程度较小。
在什么情况下应该使用哪种哈希算法?我真的很想知道答案的具体问题是:
MD5不值得信赖吗?在正常情况下,当您使用没有恶意意图的MD5算法并且任何第三方都没有恶意意图时,您会期望发生任何冲突(这意味着两个任意byte []会产生相同的哈希)
RIPEMD比SHA1好多少?(如果更好),其计算速度要慢5倍,但哈希大小与SHA1相同。
在对文件名(或其他短字符串)进行哈希处理时,获得非恶意冲突的几率是多少?(例如,两个具有相同MD5哈希值的随机文件名)(带有MD5 / SHA1 / SHA2xx)通常,非恶意冲突的几率是多少?
这是我使用的基准:
static void TimeAction(string description, int iterations, Action func) { var watch = new Stopwatch(); watch.Start(); for (int i = 0; i < iterations; i++) { func(); } watch.Stop(); Console.Write(description); Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds); } static byte[] GetRandomBytes(int count) { var bytes = new byte[count]; (new Random()).NextBytes(bytes); return bytes; } static void Main(string[] args) { var md5 = new MD5CryptoServiceProvider(); var sha1 = new SHA1CryptoServiceProvider(); var sha256 = new SHA256CryptoServiceProvider(); var sha384 = new SHA384CryptoServiceProvider(); var sha512 = new SHA512CryptoServiceProvider(); var ripemd160 = new RIPEMD160Managed(); var source = GetRandomBytes(1000 * 1024); var algorithms = new Dictionary<string,HashAlgorithm>(); algorithms["md5"] = md5; algorithms["sha1"] = sha1; algorithms["sha256"] = sha256; algorithms["sha384"] = sha384; algorithms["sha512"] = sha512; algorithms["ripemd160"] = ripemd160; foreach (var pair in algorithms) { Console.WriteLine("Hash Length for {0} is {1}", pair.Key, pair.Value.ComputeHash(source).Length); } foreach (var pair in algorithms) { TimeAction(pair.Key + " calculation", 500, () => { pair.Value.ComputeHash(source); }); } Console.ReadKey(); }