Wartość skrótu, której używa, zależy od obiektu, który jest używany jako klucz - każda klasa może zdefiniować własną metodę __hash __(), a wartość zwracana dla konkretnej instancji jest używana w słowniku.
Sam Python zapewnia implementację skrótu dla typów str i tuple. Szybkie spojrzenie na źródło powinno ujawnić dokładny algorytm dla nich.
Mieszanie krotki opiera się na hashach jego zawartości. Algorytm jest zasadniczo ten (uproszczona nieznacznie):
def hash(tuple):
mult = 1000003
x = 0x345678
for index, item in enumerate(tuple):
x = ((x^hash(item)) * mult) & (1<<32)
mult += (82520 + (len(tuple)-index)*2)
return x + 97531
Na strunach, interpreter także iteracje nad każdej postaci, łącząc je z tym (znowu, nieco uproszczony) Algorytm:
def hash(string):
x = string[0] << 7
for chr in string[1:]:
x = ((1000003 * x)^chr) & (1<<32)
return x
Większym problemem martwić się unikaniem kolizji hash. Colliding hash keys spowoduje przeszukiwanie liniowe, ponieważ słownik próbuje znaleźć miejsce do przechowywania nowego obiektu (jest to obecnie rozpoznawane jako problem bezpieczeństwa, a zachowanie może się zmieniać w nadchodzących wersjach pythona)
Spójrz na [Objects/dictnotes.txt] (http://hg.python.org/cpython/file/2.7/Objects/dictnotes.txt) – jfs
Spójrz na [to pytanie] (http://stackoverflow.com/questions/ 2070276/where-can-i-find-source-or-algorithm-of-pythons-hash-function). Ma link do [tej strony] (http://effbot.org/zone/python-hash.htm), który opisuje, w jaki sposób Python miesza różne typy i może ci się przydać. – srgerg