The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 64257.97k 187370.26k 406435.07k 576544.43k 649827.67k
sha1 73225.75k 202701.20k 432679.68k 601140.57k 679900.50k
他的英特尔(R)Core(TM)i7 CPU 920 @ 2.67GHz
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 51859.12k 156255.78k 350252.00k 513141.73k 590701.52k
sha1 56492.56k 156300.76k 328688.76k 452450.92k 508625.68k
4 回答
真正的答案是: It depends
有几个因素需要考虑,最明显的是:运行这些算法的cpu以及算法的实现 .
例如,我和我的朋友都运行完全相同的openssl版本,并且使用不同的Intel Core i7 cpu获得略有不同的结果 .
我在使用Intel(R)Core(TM)i7-2600 CPU @ 3.40GHz进行测试
他的英特尔(R)Core(TM)i7 CPU 920 @ 2.67GHz
我们都在ArchLinux官方软件包中运行与2014年10月15日OpenSSL 1.0.1j完全相同的二进制文件 .
我对此的看法是,随着sha1的安全性的增加,cpu设计者更有可能提高sha1的速度,并且更多的程序员将致力于算法的优化而不是md5sum .
我想md5将在某一天不再使用,因为它似乎没有优于sha1的优势 . 我还测试了一些真实文件的情况,结果在两种情况下总是相同的(可能受磁盘I / O限制) .
大型4.6GB文件的md5sum与同一文件的sha1sum完全相同,与许多小文件(同一目录中的488)相同 . 我运行了十几次测试,他们正在获得相同的结果 .
进一步调查这将是非常有趣的 . 我想有一些专家可以提供一个可靠的答案,为什么sha1在新处理器上比md5更快 .
在我的2012款MacBook Air(英特尔酷睿i5-3427U,2x 1.8 GHz,2.8 GHz Turbo)上,SHA-1略快于MD5(在64位模式下使用OpenSSL):
_ 1015个月后,在OS X 10.9中,SHA-1在同一台机器上变慢了:
Second update: 在OS X 10.10上,SHA-1速度回到10.8级别:
是的,MD5的CPU密集程度较低 . 在我的Intel x86(Core2 Quad Q6600,2.4 GHz,使用一个内核)上,我在32位模式下得到这个:
这在64位模式下:
对于"long"消息,数字以兆字节/秒为单位(这是对于长度超过8 kB的消息所得到的) . 这是sphlib,C(和Java)中的散列函数实现库 . 所有实现都来自同一作者(我),并且在优化方面做出了类似的努力;因此速度差异可以被认为是功能真正固有的 .
作为比较,请考虑最近的硬盘将以大约100 MB / s的速度运行,而任何通过USB的硬盘都将低于60 MB / s . 尽管SHA-256在这里显得“慢”,但对于大多数用途来说它足够快 .
注意OpenSSL包含一个32位的SHA-512实现,它比我的代码快得多(但不如64位SHA-512快),因为OpenSSL实现是在汇编中并使用SSE2寄存器,这是不能的在简单的C中完成.SAR-512是这四个中唯一一个受益于SSE2实现的功能 .
Edit: 在this page上,可以找到关于许多散列函数速度的报告(单击"Telechargez maintenant"链接) . 该报告采用法语,但大部分都是表格和数字,而且数字是国际性的 . 实现的哈希函数不包括SHA-3候选者(SHABAL除外),但我正在研究它 .
MD5也受益于SSE2的使用,查看BarsWF,然后告诉我它没有 . 所需要的只是一点汇编知识,您可以制作自己的MD5 SSE2例程 . 然而,对于大量吞吐量,在散列期间存在速度的折衷,而不是重新排列输入数据以与所使用的SIMD指令兼容所花费的时间 .