Myślę, że możesz nie zdawać sobie sprawy z niektórych subtelności, które się w to mieszczą. Pierwszy problem polega na tym, że kolejność elementów wyświetlanych w dykcie nie jest zdefiniowana przez implementację. Oznacza to, że po prostu prosząc o str
z dict nie działa, ponieważ można mieć
str(d1) == "{'a':1, 'b':2}"
str(d2) == "{'b':2, 'a':1}"
i będą hash do różnych wartościach. Jeśli masz tylko hashable przedmioty w dict, można je hash, a następnie dołączyć do swoich skrótów, jak @Bart robi lub po prostu
hash(tuple(sorted(hash(x) for x in d.items())))
Zanotuj sorted
, bo trzeba zapewnić, że krotka haszowanej wychodzi w w tym samym porządku, niezależnie od tego, w jakim porządku elementy pojawiają się w dyktowaniu. Jeśli masz dyktatury w dyktacie, możesz to powtórzyć, ale będzie to skomplikowane.
ale byłoby łatwo złamać każdą realizację takiego jeśli pozwalają arbitralnych danych w słowniku, ponieważ można po prostu napisać obiektu ze złamanym __hash__
wdrażania i wykorzystania. I nie możesz użyć id
, ponieważ wtedy możesz mieć równe przedmioty, które porównują różne.
Morał z tej historii jest taki, że dygresja hashing nie jest obsługiwana w Pythonie z jakiegoś powodu.
Co zawiera Twój dyktat? Jeśli to tylko ciągi (powiedzmy), możesz po prostu posortować posortowane ciągi znaków: 'hash (repr (posortowane (my_dict.items())))'. – katrielalex
Co to są dane abstrakcyjne? Stabilność i działanie algorytmu mieszania dyktującego zależy w dużej mierze od tego, jakie dane zawiera. Na przykład, jeśli masz dyktować dyktowanie? – katrielalex
ten typ danych: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html – sahid