結論はタイトルの通りですが,pythonで実際に測定してみました.16 bytes, 256 bytes, 4096 bytes, 65536 bytes, 1048576 bytes の長さの文字列を用意して,MD5, SHA256, SHA512 の3種類のハッシュアルゴリズムを使用してハッシュ値を取得するまでの時間を計測します.経過時間の計測には Benchmarker を使用しました.
https://pythonhosted.org/Benchmarker/
ソースコード
import hashlib from random import choice from string import ascii_letters from benchmarker import Benchmarker def get_random_string(length: int) -> str: return "".join(choice(ascii_letters) for _ in range(length)) testcase_lengths = [16**u for u in range(1, 6)] def run(): for length in testcase_lengths: t = get_random_string(length).encode("utf-8") with Benchmarker(10000) as bench: @bench(None) def _(bm): for _ in bm: pass @bench(f"md5-{length}") def _(bm): for i in bm: m = hashlib.md5() m.update(t) m.digest() @bench(f"sha256-{length}") def _(bm): for i in bm: m = hashlib.sha256() m.update(t) m.digest() @bench(f"sha512-{length}") def _(bm): for i in bm: m = hashlib.sha512() m.update(t) m.digest() if __name__ == "__main__": run()
16 bytes
## benchmarker: release 4.0.1 (for python) ## python version: 3.11.0 ## python compiler: MSC v.1933 64 bit (AMD64) ## python platform: Windows-10-10.0.19045-SP0 ## python executable: ...../python.exe ## cpu model: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel ## parameters: loop=10000, cycle=1, extra=0 ## real (total = user + sys) (Empty) 0.0010 0.0000 0.0000 0.0000 md5-16 0.0080 0.0156 0.0156 0.0000 sha256-16 0.0090 0.0000 0.0000 0.0000 sha512-16 0.0110 0.0156 0.0156 0.0000
MD5 < SHA256 < SHA512 となりました.
256 bytes
## real (total = user + sys) (Empty) 0.0010 0.0000 0.0000 0.0000 md5-256 0.0110 0.0156 0.0156 0.0000 sha256-256 0.0139 0.0156 0.0156 0.0000 sha512-256 0.0140 0.0156 0.0156 0.0000
MD5 < SHA256 = SHA512 となりました.
4096 bytes
## real (total = user + sys) (Empty) 0.0000 0.0000 0.0000 0.0000 md5-4096 0.0938 0.0938 0.0938 0.0000 sha256-4096 0.1256 0.1250 0.1094 0.0156 sha512-4096 0.0997 0.0938 0.0938 0.0000
MD5 < SHA512 < SHA256 となり,SHA512が逆転しました.
65536 bytes
## real (total = user + sys) (Empty) 0.0000 0.0000 0.0000 0.0000 md5-65536 0.9156 0.9219 0.8906 0.0312 sha256-65536 1.3673 1.3594 1.3438 0.0156 sha512-65536 0.9216 0.9219 0.9062 0.0156
MD5 = SHA512 < SHA256 となり,MD5と同じぐらいになりました.
1048576 bytes
## real (total = user + sys) (Empty) 0.0000 0.0000 0.0000 0.0000 md5-1048576 13.9647 13.9531 13.9375 0.0156 sha256-1048576 22.4829 22.3594 22.3125 0.0469 sha512-1048576 14.6089 14.5938 14.5625 0.0312
MD5 = SHA512 < SHA256 となりました.SHA256は50%ほど遅かったです.
結論
入力の長さに依らず,この中で最速なアルゴリズムは MD5 でした.256 bytes までならば SHA256 の方が速く,これより長い入力ならば,SHA512 の方が速いことが分かりました.
なお,このベンチマーク結果はアーキテクチャが AMD64 の CPU で実行したものであり, 32bit CPUなど別の環境ならば異なる結果が出ると思われます.
名前だけから判断すると SHA256 よりも SHA512 のほうが遅そうですが,ある程度の長さの入力ならば SHA512 の方が速い場合があるのは興味深かったです.