2010-02-10 33 views
12

hashlib Python模塊提供了以下的散列算法構造的顯著開銷:md5()sha1()sha224()sha256()sha384(),和sha512()是否有由使用不同版本SHA散列(hashlib模塊)

假設我不想使用md5,使用sha1而不是sha512有什麼不同嗎?我想使用類似於hashlib.shaXXX(hashString).hexdigest()的東西,但因爲它只是用於緩存,所以我不確定是否需要512(額外的)額外開銷512 ...

這種開銷是否存在,如果有,它有多大?

+2

如果是緩存,爲什麼你需要一個安全的哈希? –

+4

當你嘗試不同的方法並測量他們的表現時,你發現了什麼? –

+2

@GregHewgill可能是想說的是,有一個方便的標準庫模塊'timeit',它使得這種測量變得如此簡單,以至於只需要花費時間就可以比詢問它更容易,尤其是當它從命令行運行時。 –

回答

18

爲什麼不只是基準呢?

>>> 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 hashable dicts爲了使字典可散列。然後,所有你需要做緩存的對象是:

cache[object_to_cache] = object_to_cache 
+0

感謝您花時間對其進行基準測試。正如你們許多人所說的,我可能不需要使用安全哈希來進行緩存。 基本上我需要存儲字典內容的指紋。由於我不能直接在字典中使用'hashlib'或'hash()',我正在構建一個包含該字典元素的字符串(不喜歡這種方法),然後在其上使用'hashlib' ..但是現在你對「使用內置的Python字典」感興趣,你是什麼意思? – Emilien

+0

請參閱編輯。我希望這能解決你的問題。 – sttwister

+0

通過閱讀你的意見(你們所有人),我意識到我不需要使用任何安全的哈希,所以我實現了我自己的「哈希」算法。由於字典總是有特定的元素,每個值都有一個想法,所以我從這些想法創建一個字符串並緩存它。謝謝大家。 – Emilien

3

也許是幼稚的測試...但它看起來像它取決於你有多少散列。 2塊sha512比4塊sha256快?

>>> 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 
+0

我得到了類似的結果。我認爲這裏的事實是,md5和sha1在速度上是相似的(我也使用這種方法對md5進行了基準測試),然後sha512比中間的所有哈希快。因此,使用sha1作爲速度,使用sha512來更好地散列。其他人從性能的角度來看是沒有意義的。 –

+0

我得到了非常不同的結果,也許是當前實現或機器更好的優化: 'sha1':'0.00902104377746582' 'sha224':'0.007354021072387695' 'sha256':''0.007508993148803711' sha384':''0.004772186279296875' SHA512 ':'0.004884004592895508' – Medorator

相關問題