17

hashlibPython モジュールは、次のハッシュ アルゴリズム コンストラクターを提供します: md5()sha1()sha224()sha256()sha384()およびsha512()

md5 を使用したくない場合、たとえば sha512 の代わりに sha1 を使用することに大きな違いはありますか? のようなものを使用したいのですhashlib.shaXXX(hashString).hexdigest()が、それはキャッシュのためだけなので、512 の (最終的な) 余分なオーバーヘッドが必要かどうかはわかりません...

このオーバーヘッドは存在しますか?存在する場合、その大きさはどのくらいですか?

4

2 に答える 2

21

なぜそれをベンチマークしないのですか?

>>> def sha1(s):
...     return hashlib.sha1(s).hexdigest()
...
>>> def sha512(s):
...     return hashlib.sha512(s).hexdigest()
...
>>> t1 = timeit.Timer("sha1('asdf' * 100)", "from __main__ import sha1")
>>> t512 = timeit.Timer("sha512('asdf' * 100)", "from __main__ import sha512")
>>> t1.timeit()
3.2463729381561279
>>> t512.timeit()
6.5079669952392578

したがって、私のマシンでhash512は、 は の 2 倍遅いsha1です。しかし、GregSが言ったように、なぜセキュア ハッシュをキャッシュに使用するのでしょうか? 非常に高速で調整された組み込みのハッシュ アルゴリズムを試してください。

>>> s = "asdf"
>>> hash(s)
-618826466
>>> s = "xxx"
>>> hash(s)
943435
>>> hash("xxx")
943435

または、組み込みの Python 辞書を使用することをお勧めします。キャッシングの計画について詳しく教えてください。

編集: 私はあなたがこのようなことを達成しようとしていると思っています:

hash = hashlib.sha1(object_to_cache_as_string).hexdigest()
cache[hash] = object_to_cache

「組み込みの Python 辞書を使用する」ということで私が言及していたのは、上記を単純化できるということです。

cache[object_to_cache_as_string] = object_to_cache

このように、Python がハッシュ化を処理するので、あなたがする必要はありません!

特定の問題に関しては、辞書をハッシュ可能にするためにPython hashable dictsを参照できます。次に、オブジェクトをキャッシュするために必要なことは次のとおりです。

cache[object_to_cache] = object_to_cache

編集 - Python3 に関する注意事項

Python 3.3 ではハッシュのランダム化が導入されています。つまり、計算されたハッシュはプロセスごとに異なる可能性があるため、PYTHONHASHSEED環境変数を 0 に設定しない限り、計算されたハッシュに依存しないでください。

参照: - https://docs.python.org/3/reference/datamodel.html#object. ハッシュ - https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED

于 2010-02-10T23:18:13.123 に答える
5

おそらく単純なテストですが、どれだけハッシュしているかに依存するようです。sha512 の 2 ブロックは、sha256 の 4 ブロックよりも高速ですか?

>>> import timeit
>>> import hashlib
>>> for sha in [ x for x in dir(hashlib) if x.startswith('sha') ]:
...   t = timeit.Timer("hashlib.%s(data).hexdigest()" % sha,"import hashlib; data=open('/dev/urandom','r').read(1024)")
...   print sha + "\t" + repr(t.timeit(1000))
...
sha1    0.0084478855133056641
sha224  0.034898042678833008
sha256  0.034902095794677734
sha384  0.01980900764465332
sha512  0.019846916198730469
于 2010-02-10T23:24:17.943 に答える