Perl verwendet ein Array mit verknüpften Listen, um Kollisionen zu halten. Es hat eine einfache Heuristik, um die Größe des Arrays nach Bedarf automatisch zu verdoppeln. Es gibt auch Code, um Schlüssel zwischen Hashes zu teilen, um ein wenig Speicher zu sparen. Sie können darüber in der datierten aber immer noch relevanten Perl Illustrated Guts unter "HV" lesen. Wenn Sie wirklich abenteuerlich sind, können Sie in hv.c graben.
Der Hashalgorithmus war ziemlich simpel, aber mit Unicode wahrscheinlich viel komplizierter. Da der Algorithmus vorhersehbar war, gab es einen DoS-Angriff, bei dem der Angreifer Daten erzeugte, die Hash-Kollisionen verursachten. Zum Beispiel eine riesige Liste von Schlüsseln, die als POST-Daten an eine Website gesendet werden. Das Perl-Programm würde es wahrscheinlich teilen und es in einen Hash ausgeben, der dann alles in einen Eimer schob. Der resultierende Hash war O (n) und nicht O (1). Werfen Sie eine ganze Menge POST-Anfragen auf einen Server und Sie könnten die CPU verstopfen. Als Ergebnis stört Perl die Hash-Funktion mit ein paar zufälligen Daten.
Sie könnten auch auf how Parrot implements basic hashes betrachten, die deutlich weniger erschreckend als die Perl 5-Implementierung ist.
Verwenden Sie für "am effizientesten und praktischsten" die Hash-Bibliothek von jemand anderem. Um Gottes Willen, schreibe keinen selbst für den Produktionseinsatz. Es gibt bereits eine große Anzahl robuster und effizienter Geräte.
Sie Vielleicht möchten fragen: „Wie geht es Karten implementiert ...“ als Hash-Tabelle ist nicht der einzige Weg, um eine Karte zu implementieren! – Artelius
Guter Kommentar. Aber das Problem ist, dass ich bereits die Basisarbeit basierend auf berechneten Hashes der Symbole aufgebaut habe. Übrigens, welche anderen Möglichkeiten werden neben Hashes implementiert, von denen ich dachte, dass sie jeder nutzt? – CDR
Karten werden manchmal auch aus Binärbäumen erstellt. Es wird normalerweise verwendet, wenn der Schlüsseltyp nicht abspeicherbar ist oder wenn Sie eine bestimmte Reihenfolge der Daten in der Map beibehalten möchten (damit Sie von A nach Z iterieren können). – Crashworks