2010-02-10 21 views
12

Các Python mô-đun hashlib cung cấp các thuật toán băm nhà xây dựng sau đây: md5(), sha1(), sha224(), sha256(), sha384(), và sha512().Có một chi phí đáng kể bằng cách sử dụng các phiên bản khác nhau của sha băm (mô-đun hashlib)

Giả sử tôi không muốn sử dụng md5, có sự khác biệt lớn trong việc sử dụng, giả sử, sha1 thay vì sha512 không? Tôi muốn sử dụng một cái gì đó như hashlib.shaXXX(hashString).hexdigest(), nhưng vì nó chỉ dành cho bộ nhớ đệm, tôi không chắc chắn rằng tôi cần chi phí bổ sung (cuối cùng) của 512 ...

Chi phí này có tồn tại không, và nếu có thì nó lớn bao nhiêu ?

+2

Nếu nó là dành cho bộ nhớ đệm, tại sao bạn cần một băm bảo mật? –

+4

Khi bạn thử các phương pháp khác nhau và đo hiệu suất của chúng, bạn đã tìm thấy gì? –

+2

Những gì @GregHewgill có thể muốn nói là có một mô-đun thư viện chuẩn thuận tiện 'timeit' tạo ra các phép đo như vậy đến mức dễ dàng chỉ cần thời gian hơn là hỏi về nó, đặc biệt khi nó chạy từ dòng lệnh. –

Trả lời

18

Tại sao không chỉ là điểm chuẩn?

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

Vì vậy, trên máy tính của tôi, hash512 là hai lần chậm như sha1. Nhưng như GregS đã nói, tại sao bạn sử dụng băm an toàn cho bộ nhớ đệm? Hãy thử các thuật toán băm được xây dựng nên thực sự nhanh chóng và được điều chỉnh:

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

Hoặc tốt hơn, hãy sử dụng từ điển Python dựng sẵn. Có lẽ bạn có thể cho chúng tôi biết thêm về những gì bạn có kế hoạch trong bộ nhớ đệm.

EDIT: Tôi nghĩ rằng bạn đang cố gắng để đạt được một cái gì đó như thế này:

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

Những gì tôi đã refferring đến bởi "sử dụng dictinoaries Python BUILTIN" là bạn có thể đơn giản hóa trên :

cache[object_to_cache_as_string] = object_to_cache 

Bằng cách này, Python sẽ chăm sóc băm để bạn không phải làm vậy!

Về vấn đề cụ thể của bạn, bạn có thể tham khảo Python hashable dicts để tạo từ điển có thể băm. Sau đó, tất cả các bạn cần phải làm gì để bộ nhớ cache đối tượng là:

cache[object_to_cache] = object_to_cache 
+0

Cảm ơn bạn đã dành thời gian để đánh giá nó. Như nhiều người trong số các bạn đã nói, có lẽ tôi không cần phải sử dụng băm an toàn cho bộ nhớ đệm. Về cơ bản, tôi cần lưu trữ dấu vân tay [nội dung của] từ điển.Vì tôi không thể sử dụng 'hashlib' hoặc' hash() 'trực tiếp trên một từ điển, tôi đã xây dựng một chuỗi chứa các phần tử của từ điển đó (không thích phương pháp này) và sau đó sử dụng' hashlib' trên nó. Nhưng bây giờ bạn đã hấp dẫn tôi với "sử dụng các từ điển Python được xây dựng", bạn có ý gì bởi điều đó? – Emilien

+0

Xem chỉnh sửa. Tôi hy vọng điều này sẽ giải quyết vấn đề của bạn. – sttwister

+0

Bằng cách đọc nhận xét của bạn (tất cả các bạn), tôi nhận ra rằng tôi không cần phải sử dụng bất kỳ băm an toàn nào, vì vậy tôi đã triển khai thuật toán "băm" của riêng mình. Vì từ điển luôn có các phần tử cụ thể, và mỗi giá trị có một ý tưởng, tôi tạo một chuỗi từ những ý tưởng và bộ nhớ cache đó. Cảm ơn tất cả. – Emilien

3

Có lẽ một thử nghiệm ngây thơ ... nhưng có vẻ như nó phụ thuộc vào bao nhiêu bạn đang băm. 2 khối sha512 nhanh hơn 4 khối 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

Tôi nhận được kết quả tương tự. Tôi nghĩ rằng các de facto học tập ở đây là md5 và sha1 là tương tự về tốc độ (tôi cũng điểm chuẩn md5 bằng cách sử dụng phương pháp này) và sau đó sha512 là nhanh hơn tất cả các băm ở giữa. Vì vậy, sử dụng sha1 cho tốc độ và sha512 cho băm tốt hơn. Những người khác không có ý nghĩa từ một quan điểm thực hiện. –

+0

tôi nhận kết quả rất khác nhau, có thể thực hiện hiện tại hoặc máy được tối ưu hóa tốt hơn: 'sha1': '0.00902104377746582' ' sha224':' 0.007354021072387695' 'sha256': '0.007508993148803711'' sha384':' 0.004772186279296875' 'SHA512 ':' 0,004884004592895508' – Medorator

Các vấn đề liên quan