正在计算一个比SHA家族函数less的CPU密集度的MD5哈希值?

在“标准”笔记本电脑的x86硬件上计算MD5散列比在SHA-1或SHA-2上占用更less的CPU? 我对一般信息感兴趣,而不是特定于某个芯片。

更新:在我的情况下,我有兴趣计算文件的散列。 如果文件大小很重要,我们假设它是300K。

是的,MD5的CPU密集度稍低。 在我的Intel x86(Core2 Quad Q6600,2.4 GHz,使用一个核心),我得到这个在32位模式:

MD5 411 SHA-1 218 SHA-256 118 SHA-512 46 

这在64位模式下:

 MD5 407 SHA-1 312 SHA-256 148 SHA-512 189 

数字是兆字节每秒,对于“长”消息(这是你得到的消息长度超过8千字节)。 这是sphlib ,C(和Java)中的哈希函数实现库。 所有实现都来自相同的作者(我),并在优化方面做出类似的努力; 因此速度差异可以被认为是function的真正内在。

作为比较的一点,考虑到最近的硬盘将以大约100MB / s的速度运行,并且任何超过USB的速度都将低于60MB / s。 即使SHA-256在这里出现“慢”,对于大多数用途来说也足够快。

请注意, OpenSSL包含一个SHA-512的32位实现,它比我的代码更快(但不像64位SHA-512那么快),因为OpenSSL实现在汇编中并使用SSE2寄存器,以简单的方式完成。SHA-512是这四个中唯一受益于SSE2实现的function。

编辑:在这个页面上 ,你可以find许多哈希函数的速度报告(点击“Telechargez维护”链接)。 这份报告是法文的,但大部分都是表格和数字,而且数字是国际的。 实现的散列函数不包括SHA-3候选(SHABAL除外),但我正在处理它。

在我的2012款MacBook Air(Intel Core i5-3427U,2x 1.8 GHz,2.8 GHz Turbo)上,SHA-1稍快于MD5(在64位模式下使用OpenSSL):

 $ openssl speed md5 sha1 OpenSSL 0.9.8r 8 Feb 2011 The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes md5 30055.02k 94158.96k 219602.97k 329008.21k 384150.47k sha1 31261.12k 95676.48k 224357.36k 332756.21k 396864.62k 

更新: 10个月后,与OS X 10.9,SHA-1在同一台机器上变慢了:

 $ openssl speed md5 sha1 OpenSSL 0.9.8y 5 Feb 2013 The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes md5 36277.35k 106558.04k 234680.17k 334469.33k 381756.70k sha1 35453.52k 99530.85k 206635.24k 281695.48k 313881.86k 

第二次更新:在OS X 10.10上,SHA-1速度回到了10.8级:

 $ openssl speed md5 sha1 OpenSSL 0.9.8zc 15 Oct 2014 The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes md5 35391.50k 104905.27k 229872.93k 330506.91k 382791.75k sha1 38054.09k 110332.44k 238198.72k 340007.12k 387137.77k 

真正的答案是: 这取决于

有几个因素需要考虑,最明显的是:你正在运行这些algorithm的CPU以及algorithm的实现。

例如,我和我的朋友都运行完全相同的openssl版本,并得到不同的英特尔酷睿i7 cpu的结果略有不同。

我的testing工作与英特尔(R)核心(TM)i7-2600 CPU @ 3.40GHz

 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 

而他的英特尔®酷睿™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 

我们都使用ArchLinux官方软件包运行2014年10月15日的OpenSSL 1.0.1j完全相同的二进制文件。

我的观点是,在sha1的安全性方面,CPUdevise者更有可能提高sha1的速度,而更多的程序员将会比md5sum更好地进行algorithm的优化。

我想这个md5将不再被使用,因为它似乎没有sha1的优势。 我还testing了一些真实文件的情况,结果在两种情况下都是一样的(可能受到磁盘I / O的限制)。

一个大的4.6GB文件的md5sum与同一个文件的sha1sum完全相同,而同一个文件(488在同一个目录中)也是一样。 我跑了十几次testing,他们正在得到相同的结果。

进一步调查这将是非常有趣的。 我想有一些专家可以提供一个坚实的答案,为什么sha1在新的处理器上比md5更快。

MD5也受益于SSE2使用,检查BarsWF,然后告诉我,它不。 所需要的只是一点汇编知识,你可以制定自己的MD5 SSE2例程。 然而,对于大量的吞吐量,在散列期间存在速度的权衡,而不是重新排列input数据的时间与所使用的SIMD指令兼容。