Also können je nach Hash-Funktion durchaus mehrere Objekte in eine Stelle des Arrays passen?
Natürlich. Kollisionen gehören zum Hashing dazu (perfektes Hashing, also ohne Kollisionen, gibt es zwar, ist aber selten und funktioniert praktisch nur für unveränderliche Daten).
Dadurch lassen sich große Datenmengen schnell vergleichen da nur die Hash-Adressen verglichen werden.
Jein. Mittels eines Hashwerts lässt sich die Ungleichheit feststellen, nicht aber die Gleichheit. Es gilt nur: unterscheiden sich die Hashwerte zweier Objekte, dann sind die Objekte garantiert verschieden.
Das ist wie ein Vergleich von Personen anhand der Nachnamen: sind die Nachnamen verschieden, weißt Du, dass es verschiedene Personen sind. Sind die Nachnamen dagegen gleich, bedeutet das nicht automatisch, dass es sich um gleiche oder gar die selbe Person handelt.
Beim Hashing geht es einfach darum, Speicheradressen anhand des Schlüssel zu berechnen. Das bedeutet nicht, dass dies gleich die Adresse des gesuchten Objekts ist, das hängt wiederum von der Kollisionsbehandlung ab.
Einfaches Beispiel: Du hast drei Eimer, in die sollst Du Bälle unterschiedlicher Farbe einsortieren. Den Hashwert eines Balls soll ermittelt werden, indem einfach für jeden Buchstaben der Farbbezeichnung die Position im Alphabet ermittelt und aufsummiert wird. Beispiel: ROT = 18 + 15 + 20 = 53.
Um die so erhaltenen Werte auf drei Eimer aufzuteilen, ermittelst Du einfach den Rest, der sich bei der Division des Hashwerts durch 3 ergibt (% = Modulo-Operator).
Du hast also drei Eimer: 0, 1, 2 und ich gebe Dir jetzt einen roten Ball (ROT = Hashwert 53). Du berechnest jetzt 53 % 3 = 2, also kommt der Ball in den Eimer 2. Jetzt gebe ich Dir einen blauen Ball (BLAU = Hashwert 36). Du berechnest jetzt 36 % 3 = 0, also kommt der Ball in den Eimer 0. Jetzt gebe ich Dir einen gelben Ball (GELB = Hashwert 26). Du berechnest jetzt 26 % 3 = 2, der Ball würde also im gleichen Eimer landen wie der rote. Das ist eine Kollision. Die kann man nun unterschiedlich behandeln, wir machen es uns einfach und sagen, dass sich in jedem Eimer beliebig viele Bälle befinden können (also eine Menge von Bällen enthalten kann) und schmeißen den blauen Ball zum roten dazu.
Jetzt bitte ich Dich, mir einen braunen Ball zu geben. Du kannst - ohne einen Blick auf die Eimer werfen zu müssen - sagen, in welchem Eimer sich der braune Ball befinden müsste: dazu berechnest Du einfach den Index des Eimers - wie vorhin: Hashwert von BRAUN = 56, 56 % 3 = 2, also kann sich der braune Ball nur in Eimer 2 befinden, wenn er denn überhaupt vorhanden ist.
Um das zu überprüfen, musst Du im Eimer nach dem Ball suchen. Das kann man so machen, dass Du blind einen Ball nach dem nächsten aus dem Eimer nimmst und schaust, ob er braun ist. Gibt es keine weiteren Bälle, enthält kein Eimer einen braunen Ball. Hast Du dagegen einen braunen Ball gefunden, kannst Du ihn mir geben -> Suche erfolgreich.
Im Beispiel würdest Du z. B. erst mal einen roten Ball herausnehmen. Der ist nicht braun, also weiter. Jetzt würdest Du den blauen Ball aus dem Eimer fischen. Der ist auch nicht braun, also weiter. Jetzt stellst Du fest: oh, der Eimer ist leer -> Ergebnis: kein brauner Ball vorhanden.