Cách tốt nhất để tạo khóa duy nhất cho nội dung của từ điển là gì. Ý định của tôi là lưu trữ từng từ điển trong một cửa hàng tài liệu cùng với một id hoặc băm duy nhất để tôi không phải tải toàn bộ từ điển từ cửa hàng để kiểm tra xem nó có tồn tại hay không. Từ điển có cùng khóa và giá trị phải tạo cùng một id hoặc băm.Cách tạo khóa duy nhất cho từ điển trong Python
Tôi có đoạn mã sau:
import hashlib
a={'name':'Danish', 'age':107}
b={'age':107, 'name':'Danish'}
print str(a)
print hashlib.sha1(str(a)).hexdigest()
print hashlib.sha1(str(b)).hexdigest()
Hai báo cáo in cuối cùng tạo ra các chuỗi tương tự. Đây có phải là triển khai tốt không? hoặc có bất kỳ cạm bẫy với cách tiếp cận này? Có cách nào tốt hơn để làm điều này?
Cập nhật
gợi ý kết hợp từ các câu trả lời dưới đây, sau đây có thể là một thực hiện tốt
import hashlib
a={'name':'Danish', 'age':107}
b={'age':107, 'name':'Danish'}
def get_id_for_dict(dict):
unique_str = ''.join(["'%s':'%s';"%(key, val) for (key, val) in sorted(dict.items())])
return hashlib.sha1(unique_str).hexdigest()
print get_id_for_dict(a)
print get_id_for_dict(b)
thực hiện của bạn trong bản cập nhật là rất sai: thử điều này: 'get_id_for_dict ({ 'foo':' bar '}) 'hoặc' get_id_for_dict ({' fo ':' obar '}) 'hoặc' get_id_for_dict ({' f ':' o ',' o ':' bar '}) '. Tất cả đều trả về '8843d7f92416211de9ebb963ff4ce28125932878'. Sử dụng tốt hơn 'unique_str = join (['% s% s'% (hashlib.sha1 (khóa), hashlib.sha1 (val)) cho (key, val) trong sắp xếp (dict.items())])' – Tometzky
@ Tometzky Cảm ơn bạn đã chỉ ra sai lầm của tôi. Tôi đã thử đề xuất của bạn, nhưng nó không thành công nếu các khóa hoặc giá trị không thuộc loại chuỗi. Thay vào đó, tôi chỉ thay đổi định dạng chuỗi để bao bọc khóa & giá trị trong dấu ngoặc kép và đặt ký tự đại tràng giữa chúng – Danish
Vẫn không tốt nếu có thể có ''', ':' và ';' trong khóa hoặc giá trị. Sử dụng 'unique_str = join (['% s% s'% (hashlib.sha1 (str (khóa)), hashlib.sha1 (str (val))) cho (key, val) trong sắp xếp (dict.items()) ]) ' – Tometzky