SHAハッシュの異なるバージョンを使用して、大きなオーバーヘッドがある(hashlibモジュール)
質問
hashlib
、md5()
、sha1()
: sha224()
のPythonのモジュールは、以下のハッシュアルゴリズムのコンストラクタを提供します、sha256()
、sha384()
、およびsha512()
ます。
私はMD5を使用したくないと仮定すると、たとえば、SHA1の代わりに、SHA512を使用することには大きな違いがありますか?私はhashlib.shaXXX(hashString).hexdigest()
のようなものを使用したいのですが、それだけでキャッシュのためだとして、私は512の(最終的な)余分なオーバーヘッドを必要とわからないんだけど...
このオーバーヘッドが存在するか、もしそうなら、それをどのように大きなですか?
解決
なぜだけではなく、ベンチマークそれ?
>>> 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
は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 dictinoariesを使う」によってrefferringたことは、あなたが上記を簡素化することができるということです。
cache[object_to_cache_as_string] = object_to_cache
あなたがする必要はありませんので、この方法では、Pythonはハッシュの世話を!
あなたの特定の問題について、あなたは辞書ハッシュ可能にするために Pythonのハッシュ可能dicts を参照してください可能性があり。次に、あなたがオブジェクトをキャッシュするために行う必要があると思いますすべては、次のとおりです。
cache[object_to_cache] = object_to_cache
他のヒント
おそらくナイーブテスト...しかし、それはあなたがハッシュ化しているどのくらいに依存ように見えます。 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