npJak wygenerować unikatowy równy skrót dla równych słowników?
>>> a = {'req_params': {'app': '12345', 'format': 'json'}, 'url_params': {'namespace': 'foo', 'id': 'baar'}, 'url_id': 'rest'}
>>> b = {'req_params': { 'format': 'json','app': '12345' }, 'url_params': { 'id': 'baar' ,'namespace':'foo' }, 'url_id': 'REST'.lower() }
>>> a == b
True
Co jest dobrym funkcja hash mieszań wygenerować równe dla obu dicts? Słowniki będą mieć podstawowe typy danych, takie jak int, list, dict i stringi, żadnych innych obiektów.
Byłoby świetnie, gdyby hash był zoptymalizowany pod względem przestrzeni, docelowy zestaw wynosi około 5 milionów obiektów, a więc prawdopodobieństwo kolizji jest znacznie mniejsze.
Nie jestem pewien, czy json.dumps lub inne serializacje wynagradzają równość zamiast struktury członków w słowniku. np. Podstawowe mieszania za pomocą STR dict nie działa:
>>> a = {'name':'Jon','class':'nine'}
>>> b = {'class':'NINE'.lower(),'name':'Jon'}
>>> str(a)
"{'name': 'Jon', 'class': 'nine'}"
>>> str(b)
"{'class': 'nine', 'name': 'Jon'}"
json.dumps nie działa albo:
>>> import json,hashlib
>>> a = {'name':'Jon','class':'nine'}
>>> b = {'class':'NINE'.lower(),'name':'Jon'}
>>> a == b
True
>>> ha = hashlib.sha256(json.dumps(a)).hexdigest()
>>> hb = hashlib.sha256(json.dumps(b)).hexdigest()
>>> ha
'545af862cc4d2dd1926fe0aa1e34ad5c3e8a319461941b33a47a4de9dbd7b5e3'
>>> hb
'4c7d8dbbe1f180c7367426d631410a175d47fff329d2494d80a650dde7bed5cb'
Hash stringified dict? Nie wiem, czy to gwarantuje równość ... np. jeśli jego klucze (i klucze ich kluczy itd.) zostaną wydrukowane posortowane – Patashu
@Patashu, nie oznacza to jednakowych wartości haszowania, spróbuj zrobić to dla równych dyktatur z różną kolejnością klawiszy. – DhruvPathak
Rzeczywiście, drukowanie dyktatury wydaje się być wydrukowane jakoś posortowane (nie wiem jak, ale) – njzk2