Python hash functie
Op deze pagina:
De ingebouwde hash functie in Python geeft een integer als hash waarde van een object indien deze bestaat. Deze hash waarde wordt gebruikt om op een snelle manier dictionary sleutels te vergelijken bij het bekijken van een dictionary. Python gebruikt ook hashes bij sets.
Hashing is het berekenen van een getal met een vaste lengte die een gegeven (object) vertegenwoordigt, hetzelfde gegeven geeft het zelfde getal, een kleine verandering in het gegeven kan al een grote verandering in het berekende getal zijn. Dat gegeven kan een enkel woord zijn, maar het kan ook een compleze datastructuur zijn die via een hash snel vergeleken kan worden met de andere gegevens.
Alleen immutable objecten zijn hashable, zoals: booleans, integers, floats, strings en tuples. ook instances van zelfgemaakt classes kunnen, indien zij immutable zijn, hashbaar zijn. Niet hashbaar zijn bjvoorbeeld: byrearray, list, set en dictionary.
# objecten initialiseren
int_waarde = 33
str_waarde = 'web2.nl'
flt_waarde = 12.98
tuple_waarde = (1, 2, 3, 4, 5, 6)
# je kan alleen de hash krijgen van een immutable object
# een hash van een lijst zal een foutmelding geven
list_waarde = [1, 2, 3, 4, 5, 6]
# de hash waarden laten zien
print("De integer hash waarde is : " + str(hash(int_waarde)))
print("De string hash waarde is : " + str(hash(str_waarde)))
print("De float hash waarde is : " + str(hash(flt_waarde)))
print("De tuple hash waarde is : " + str(hash(tuple_waarde)))
print("De list hash waarde is : " + str(hash(list_waarde)))
# resultaat:
De integer hash waarde is : 33
De string hash waarde is : 4474760767236934575
De float hash waarde is : 2259726149029421068
De tuple hash waarde is : 5881802312257552497
TypeError: unhashable type: 'list'
Mutable (aanpasbare) container objecten zoals lists en dictionaries zijn zelf niet hashbaar.
De hash van zelfgemaakte objecten
Zelfgemaakte objecten kunnen ook een hash functie gebruiken indien ze immutable (onveranderbaar) zijn en zowel een __eq__ als een __hash__ geimplementeerd hebben. De __hash__() methode moet altijd een integer teruggeven.
Objecten die met elkaar vergeleken worden en als gelijk worden beschouwd moeten dan ook dezelfde hash waarde hebben.
Standaard zijn objecten (instances van zelfgedefinieerde classes) hashbaar, als ze vergeleken worden zullen ze standaard als ongelijk worden aangeduid, tenzij je ze met zichzelf vergelijkt. De hash waarde wordt hier afgeleid van hun id.
hash met @dataclass decorator
Als je aan class aanmaakt met de @dataclass decorator, dan heb je de mogelijkheid om deze als argument frozen=True mee te geven, dan worden de instances van dit object read-only en dus hashbaar. Standaard heeft een class met de @dataclass decorator frozen=False.