みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

SHA256よりもSHA512が速いらしい

結論はタイトルの通りですが,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 の方が速い場合があるのは興味深かったです.