Signatur
Beschreibung
QuickHashStringIntHash ist eine spezialisierte Hashtabellen-Implementierung aus der QuickHash-Extension, die für Szenarien optimiert ist, in denen Zeichenketten als Schlüssel und ganze Zahlen als Werte gespeichert werden müssen. Gegenüber allgemeinen PHP-Arrays bietet sie bei großen Datenmengen einen reduzierten Speicherverbrauch und eine bessere Suchperformance.
Die Klasse eignet sich besonders dann, wenn sehr viele Einträge (Tausende bis Millionen) verwaltet werden müssen, etwa für Wortfrequenzzähler, schnelle Token-Lookups oder die Zuordnung von Bezeichnern zu numerischen IDs. Sie unterstützt das Laden und Speichern von Hashtabellen aus/in Dateien sowie aus/in Strings, was Persistenz ohne Serialisierung ermöglicht.
Beim Erzeugen eines Objekts wird die initiale Größe des Buckets-Arrays festgelegt. Eine zu kleine Initialgröße führt zu häufigeren Kollisionen, eine zu große verschwendet Speicher. Als Faustregel gilt: Die Initialgröße sollte in etwa der erwarteten Anzahl der Einträge entsprechen oder etwas größer gewählt werden.
Die Klasse bietet außerdem Optionen wie QuickHashStringIntHash::CHECK_FOR_DUPES, um doppelte Schlüssel beim Einfügen zu erkennen, sowie QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC, um den eigenen Speichermanager statt dem Zend-Allocator zu verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $size Pflicht | int | Die anfängliche Anzahl der Buckets der Hashtabelle. Größere Werte reduzieren Kollisionen, benötigen aber mehr Speicher. | |
| $options | int | 0 | Bitmaske aus Klassen-Konstanten wie QuickHashStringIntHash::CHECK_FOR_DUPES oder QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC. |
Beispiele
Grundlegende Verwendung: Einträge hinzufügen und nachschlagen
<?php
// Hashtabelle mit 1024 Buckets anlegen
$hash = new QuickHashStringIntHash(1024);
// Einträge hinzufügen
$hash->add('apfel', 3);
$hash->add('banane', 7);
$hash->add('kirsche', 12);
// Wert anhand eines Schlüssels abrufen
$wert = $hash->get('banane');
echo $wert; // 7
// Prüfen, ob ein Schlüssel existiert
if ($hash->exists('apfel')) {
echo "apfel ist vorhanden" . PHP_EOL;
}
// Eintrag löschen
$hash->delete('kirsche');
echo $hash->exists('kirsche') ? 'vorhanden' : 'nicht vorhanden'; // nicht vorhanden
Hashtabelle in Datei speichern und laden
<?php
// Hashtabelle befüllen
$hash = new QuickHashStringIntHash(512, QuickHashStringIntHash::CHECK_FOR_DUPES);
$hash->add('php', 1);
$hash->add('python', 2);
$hash->add('ruby', 3);
// In Datei speichern
$hash->saveToFile('/tmp/sprachen.hash');
// Hashtabelle aus Datei wiederherstellen
$geladenHash = QuickHashStringIntHash::loadFromFile('/tmp/sprachen.hash');
echo $geladenHash->get('python'); // 2
echo PHP_EOL;
echo $geladenHash->get('ruby'); // 3
Wortfrequenzzähler mit QuickHashStringIntHash
<?php
$text = 'der die das der die der ein eine ein der';
$woerter = explode(' ', $text);
$freq = new QuickHashStringIntHash(64);
foreach ($woerter as $wort) {
if ($freq->exists($wort)) {
$freq->set($wort, $freq->get($wort) + 1);
} else {
$freq->add($wort, 1);
}
}
foreach (['der', 'die', 'ein'] as $w) {
echo $w . ': ' . $freq->get($w) . PHP_EOL;
}
// Wichtig · Fallstricke
Verfügbarkeit: Die QuickHash-Extension ist ab PHP 5.5 im Core enthalten, wurde jedoch in PHP 8.0 als veraltet (deprecated) markiert und in PHP 8.1 vollständig aus dem Core entfernt. Für moderne Projekte sollte stattdessen ein normales array oder eine SplFixedArray-basierte Lösung genutzt werden.
Die Methode set() aktualisiert den Wert eines vorhandenen Schlüssels, während add() bei aktivierter Option CHECK_FOR_DUPES false zurückgibt, falls der Schlüssel bereits existiert. Ohne diese Option können Duplikate stillschweigend eingefügt werden, was zu unerwartetem Verhalten bei get() führen kann.
Die Serialisierungsmethoden saveToFile(), loadFromFile(), saveToString() und loadFromString() verwenden ein binäres Format und sind nicht portabel zwischen verschiedenen PHP-Versionen oder Architekturen (32-Bit vs. 64-Bit).