Blaubart: PHP - Mysql -> Zweidimensionales Array erzeugen

Beitrag lesen

Tach.

Ich nehme also mit, dass man den String in die Hash-Funktion steckt, und heraus kommt eine Positionsangabe in der Schlüsselauflistung.

Richtig.

Halten wir also fest, und kommen damit wieder auf das Laufzeit-Problem des OPs zurück: Ob die Hash-Funktion nun komplex oder weniger komplex ist, (deutlich) aufwendiger als eine Positionsbestimmung per Multiplikation ist sie.

Damit du dir selber ein Bild von der Komplexität machen kannst, kopier ich dir mal PHP4s Hashfunktion für Strings -- numerische Schlüssel werden ja nicht gehasht -- direkt aus der zend_hash.h:

  
static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength)  
{  
 ulong h = 5381;  
 char *arEnd = arKey + nKeyLength;  
  
 while (arKey < arEnd) {  
  h += (h << 5);  
  h ^= (ulong) *arKey++;  
 }  
 return h;  
}  

Mehr als eine Multiplikation und Addition, wie du siehst; aber eben "nichts" im Vergleich zum Durchsuchen der gesamten Tabelle. Man *berechnet* ja direkt den Index in den Hashtable, anstatt Daten einzulesen und mit der Vorgabe zu vergleichen.

Da das aber PHP-Interna sind, die man als Anwender sowieso nicht beeinflussen kann, hat man schlechte Karten.

So sieht's wohl aus, ja. Der wirklich aufwendige Teil dürfte aber in der Tat das Erstellen der Arrays aus den MySql-Daten sein, nicht die späteren Zugriffe auf einzelne Elemente.

[1] Mindestens genauso wichtig sind wahrscheinlich die Mechanismen zur Behandlung von Kollisionen. Aber das bringt dieses Thema so langsam an einen Punkt, wo ich die Lektüre eines Fachbuchs vorschlagen würde, anstatt hier im Forum weiter darüber zu referieren. ;)

Bei einem PHP-Array kann es keine zwei Schlüssel mit dem gleichen Wert geben.

Richtig. Aber -- wie du selber schon feststellst -- zwei unterschiedliche Werte, die den gleichen Hash liefern.

Wenn die Hash-Funktion für unterschiedliche Schlüssel den gleichen Hashwert errechnet, war sie nicht optimal.

Es ist zwar möglich, solche "perfekten" Hashfunktionen zu entwerfen, aber man kriegt damit z. B. Probleme, wenn man die Größe der Hashmap dynamisch verändern möchte. Und da die Informatiker eingesehen haben, daß es auf lange Sicht zu aufwendig ist, immer dieses Optimum anzupeilen, nahmen sie die Kollisionen in Kauf und entwickelten vernünftige Möglichkeiten, um diese zu handhaben.

--
Once is a mistake, twice is jazz.