Jaki jest najlepszy sposób wygenerowania unikalnego klucza dla zawartości słownika. Moim zamiarem jest przechowywanie każdego słownika w magazynie dokumentów wraz z unikalnym identyfikatorem lub hash, tak aby nie musiałem ładować całego słownika ze sklepu, aby sprawdzić, czy istnieje już on, czy nie. Słowniki z tymi samymi kluczami i wartościami powinny generować ten sam identyfikator lub skrót.Jak utworzyć unikalny klucz dla słownika w języku Python
Mam następujący kod:
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()
ostatnich dwóch instrukcji print generuje ten sam ciąg. Czy to jest dobra implementacja? czy są jakieś pułapki z tym podejściem? Czy jest lepszy sposób to zrobić?
Aktualizacja
Łączenie propozycje z poniższych odpowiedzi, co następuje może być dobre wykonanie
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)
Implementacja w aktualizacji jest bardzo źle: spróbuj tego: 'get_id_for_dict ({ 'foo':” bar '}) 'lub' get_id_for_dict ({' fo ':' obar '}) 'lub' get_id_for_dict ({' f ':' o ',' o ':' bar '}) '. Wszystkie zwracają '8843d7f92416211de9ebb963ff4ce28125932878'. Lepiej użyj 'unique_str = join (['% s% s'% (hashlib.sha1 (key), hashlib.sha1 (val)) dla (key, val) w posortowanym (dict.items())])' – Tometzky
@ Tometzky Dzięki za wskazanie mojego błędu. Próbowałem Twojej sugestii, ale nie udało się, jeśli klucze lub wartości nie są typu ciąg. Zamiast tego, właśnie zmieniłem format ciągu, aby zawrzeć klucz i wartość w cudzysłowach i umieścić między nimi znak dwukropka. – Danish
Nadal nie jest dobrze, jeśli w kluczu lub wartości mogą znajdować się '' ',': 'i'; '. Użyj 'unique_str = join (['% s% s'% (hashlib.sha1 (str (key)), hashlib.sha1 (str (val))) dla (key, val) w posortowaniu (dict.items()) ]) ' – Tometzky