MD5ハッシュの計算は、「標準」ラップトップx86ハードウェア上のSHA-1またはSHA-2よりもCPUの負荷が少ないですか?特定のチップに固有ではなく、一般的な情報に興味があります。
PDATE:私の場合、ファイルのハッシュを計算することに興味があります。ファイルサイズが重要な場合は、300Kと仮定しましょう。
はい、MD5はCPUにそれほど負荷をかけません。 Intel x86(Core2 Quad Q6600、2.4 GHz、1つのコアを使用)で、32ビットモードでこれを取得します。
MD5 411
SHA-1 218
SHA-256 118
SHA-512 46
そして、これは64ビットモードで:
MD5 407
SHA-1 312
SHA-256 148
SHA-512 189
「長い」メッセージの場合、数値は1秒あたりのメガバイト数です(これは、8 kBを超えるメッセージに対して取得されるものです)。これは、C(およびJava)のハッシュ関数実装のライブラリである sphlib を使用しています。すべての実装は同じ著者(私)からのものであり、最適化に匹敵する努力をして作られました。したがって、速度の違いは、機能に本当に固有のものと見なすことができます。
比較のポイントとして、最近のハードディスクは約100 MB /秒で実行され、USBを介したものはすべて60 MB /秒未満になると考えてください。ここではSHA-256が「遅い」ように見えますが、ほとんどの目的には十分高速です。
OpenSSL にはSHA-512の32ビット実装が含まれていることに注意してください。OpenSSL実装はアセンブリおよびSSE2レジスタを使用します。これはプレーンCでは実行できません。SHA-512は、これら4つの中でSSE2実装の恩恵を受ける唯一の機能です。
Edit:on このページ で、多くのハッシュ関数の速度に関するレポートを見つけることができます(「Telechargez maintenant 「リンク」。レポートはフランス語ですが、ほとんどが表と数字でいっぱいで、数字は国際的です。実装されたハッシュ関数にはSHA-3候補(SHABALを除く)は含まれていませんが、現在取り組んでいます。
2012年のMacBook Air(Intel Core i5-3427U、2x 1.8 GHz、2.8 GHz Turbo)では、SHA-1はMD5よりわずかに高速です(OpenSSLを64ビットモードで使用):
$ 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
更新: OS X 10.9で10か月後、同じマシンで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
2回目の更新: 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
回目の更新: LibreSSLを使用したOS X 10.14は、はるかに高速です(同じマシンでも)。 SHA-1が引き続き上位に表示されます。
$ openssl speed md5 sha1
LibreSSL 2.6.5
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md5 43128.00k 131797.91k 304661.16k 453120.00k 526789.29k
sha1 55598.35k 157916.03k 343214.08k 489092.34k 570668.37k
本当の答えは:それは依存する
考慮すべき要素がいくつかありますが、最も明白なのは、これらのアルゴリズムを実行しているCPUとアルゴリズムの実装です。
たとえば、私と私の友人は両方ともまったく同じopensslバージョンを実行しており、Intel Core i7 cpusが異なると結果が少し異なります。
Intel(R)Core(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
そして彼のIntel(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
私たちは両方とも、ArchLinux公式パッケージからOpenSSL 1.0.1j 2014年10月15日のまったく同じバイナリを実行しています。
これについての私の意見は、sha1のセキュリティが強化されたため、CPU設計者はsha1の速度を改善する可能性が高く、md5sumよりも多くのプログラマがアルゴリズムの最適化に取り組んでいると考えています。
Md5はsha1よりも有利ではないと思われるため、いつか使用されなくなると思います。また、実際のファイルでいくつかのケースをテストしましたが、結果は常に両方のケースで同じでした(ディスクI/Oによって制限される可能性が高い)。
4.6GBの大きなファイルのmd5sumは、同じファイルのsha1sumとまったく同じ時間を要しました。多くの小さなファイル(同じディレクトリ内の488)でも同じです。私はテストを数十回実行しましたが、それらは常に同じ結果を得ていました。
-
これをさらに調査することは非常に興味深いでしょう。新しいプロセッサでsha1がmd5より高速になっている理由に対する確かな答えを提供できる専門家が何人かいると思います。
MD5はSSE2の使用からも恩恵を受けます。BarsWFをチェックして、そうではないと教えてください。必要なのは、わずかなアセンブラー知識であり、独自のMD5 SSE2ルーチンを作成できます。ただし、大量のスループットの場合、使用されるSIMD命令と互換性があるように入力データを再配置するのにかかる時間とは対照的に、ハッシュ中の速度のトレードオフがあります。
sha1sumはmd5sumよりPower9でかなり高速です
$ uname -mov
#1 SMP Mon May 13 12:16:08 EDT 2019 ppc64le GNU/Linux
$ cat /proc/cpuinfo
processor : 0
cpu : POWER9, altivec supported
clock : 2166.000000MHz
revision : 2.2 (pvr 004e 1202)
$ ls -l linux-master.tar
-rw-rw-r-- 1 x x 829685760 Jan 29 14:30 linux-master.tar
$ time sha1sum linux-master.tar
10fbf911e254c4fe8e5eb2e605c6c02d29a88563 linux-master.tar
real 0m1.685s
user 0m1.528s
sys 0m0.156s
$ time md5sum linux-master.tar
d476375abacda064ae437a683c537ec4 linux-master.tar
real 0m2.942s
user 0m2.806s
sys 0m0.136s
$ time sum linux-master.tar
36928 810240
real 0m2.186s
user 0m1.917s
sys 0m0.268s