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
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? –
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ì? –
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. –