Các băm BUILTIN nhỏ nhất tôi biết là md5
>>> import hashlib
>>> hashlib.md5("hello worlds").digest().encode("base64")
'uWuHitcvVnCdu1Yo4c6hjQ==\n'
va chạm thấp và ngắn có phần loại trừ lẫn nhau do sự birthday paradox
Để làm cho nó urlsafe bạn cần phải sử dụng các chức năng từ base64 mô-đun
>>> import base64
>>> base64.urlsafe_b64encode(hashlib.md5("hello world").digest())
'XrY7u-Ae7tCTyyK7j1rNww=='
Tuy nhiên, sẽ không có vấn đề gì khi lưu trữ thông tin 16 byte md5 trong cơ sở dữ liệu dưới dạng nhị phân.
>>> md5bytes=hashlib.md5("hello world").digest()
>>> len(md5bytes)
16
>>> urllib.quote_plus(md5bytes)
'%5E%B6%3B%BB%E0%1E%EE%D0%93%CB%22%BB%8FZ%CD%C3'
>>> base64.urlsafe_b64encode(md5bytes)
'XrY7u-Ae7tCTyyK7j1rNww=='
Bạn có thể chọn một trong hai quote_plus
hoặc urlsafe_b64encode
cho url của bạn, sau đó giải mã với chức năng tương ứng unquote_plus
hay urlsafe_b64decode
trước khi bạn nhìn chúng trong cơ sở dữ liệu.
Nguồn
2010-03-24 19:51:52
Cảm ơn. Có hàm băm chữ và số va chạm thấp nào, ít hơn 16 ký tự, không liên quan đến cắt xén không? Cảm ơn bạn. – ensnare
Tại sao bạn không muốn cắt bớt? –
Bạn cũng có thể muốn xóa tất cả '=' ký tự được thêm vào cuối. Chúng không làm giảm đáng kể tỷ lệ va chạm, nhưng chúng thêm hai ký tự. Vì vậy, có thể một cái gì đó như: 'base64.urlsafe_b64encode (hasher.digest() [0:10]). Thay thế ('=', '')' – speedplane