Ich habe die vorherigen Fragen zu diesem Thema überprüft, konnte aber keine Lösung finden, die meinen Anforderungen entspricht.
Was ich brauche:
Unterstützt sowohl Strings als auch Integer-Tupel (int-Arrays in C). Wenn es sich um ein Integer-Array handelt, wird die Länge zur Kompilierzeit festgelegt.
Schnell.
Speicher effizient. Ich muss es verwenden, um super große Datensätze zu verarbeiten.
Die Kapazität der Hash-Tabellen wird dynamisch wachsen. Ich mag das Wachstum der Größe der Hash-Tabellen, die von der Bibliothek behandelt werden, statt mir.
Ich muss eine große Anzahl solcher Hashtabellen erstellen. Und diese Hash-Tabellen werden wie ein Baum verknüpft, indem die Werte in einer Hash-Tabelle auf andere Hash-Tabellen verweisen.
Meine Anwendung ist sowohl Speicher- als auch CPU-gebunden. -- Wie viel Glück ich habe! :)
Ich betrachte keine C ++ - Implementierung für jetzt, außer ich konnte keine Lösung in C finden.
Danke!
Was ist mit uthash - einer Hash-Tabelle für C-Strukturen .
uthash hat keine Einschränkung gegenüber Schlüsseln : Schlüssel und Struktur können haben beliebiger Datentyp .
Es enthält Standard-Makros, um allgemeine Schlüsseltypen zu hashen, nämlich Integer und Strings. Zusätzlich bietet es generische Makros ( HASH_ADD
und HASH_FIND
) zur Unterstützung von einem beliebigen Datentyp .
Es klingt so zu sein :
Hinzufügen, Suchen und Löschen sind normalerweise Operationen mit konstanter Zeit. [...] Dieses Hash soll minimalistisch und effizient sein. Es sind etwa 900 Zeilen C.
Weitere Details hier :
Das Hash-Handle belegt auf einem 32-Bit-System etwa 32 Byte pro Element oder auf einem 64-Bit-System 56 Byte pro Element. Die anderen Gemeinkosten - die Eimer und der Tisch - sind im Vergleich vernachlässigbar.
out-of-the-box wird unterstützt:
Die Bucket-Erweiterung erfolgt automatisch und unsichtbar nach Bedarf. Die Anwendung muss nicht wissen, wann sie auftritt.
Blender (die 3D-Grafikanwendung) hat eine eigene Hashing-Bibliothek namens BLI_ghash , die einige nützliche Funktionen bietet.
Obwohl es nicht als eigenständige Bibliothek geschrieben wurde, ist es nicht schwer zu extrahieren, aber es kann als Referenz nützlich sein. (beachten Sie die GPL2-Lizenz) .
Weitere Ergänzungen:
Die eine Sache, die es aus Ihrer Beschreibung nicht ganz so gut macht, ist das Zuweisen vieler Karten, da jeder seinen eigenen Speicherpool erhält, aber es gibt keine großen Grenzen, die Sie daran hindern, einen Mempool zu teilen, Es ist einfach nicht out of the box.
Quellcode: BLI_ghash.c , BLI_ghash.h BLI_mempool.c , BLI_mempool.h
Hinweise, MEM_mallocN/MEM_freeN
Funktionen können durch malloc/free