sucht nach Hash-Tabelle C-Bibliothek [geschlossen]

8

Ich habe die vorherigen Fragen zu diesem Thema überprüft, konnte aber keine Lösung finden, die meinen Anforderungen entspricht.

Was ich brauche:

  1. 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.

  2. Schnell.

  3. Speicher effizient. Ich muss es verwenden, um super große Datensätze zu verarbeiten.

  4. 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.

  5. 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!

    
Jian Feng 12.08.2013, 22:39
quelle

2 Antworten

10

Was ist mit uthash - einer Hash-Tabelle für C-Strukturen .

  • Unterstützt sowohl Strings als auch Integer-Tupel

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 .

  • Schnell

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.

  • Speichereffizienz

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.

  • Die Kapazität der Hashtabellen wird dynamisch erhöht

out-of-the-box wird unterstützt:

  

Die Bucket-Erweiterung erfolgt automatisch und unsichtbar nach Bedarf. Die Anwendung muss nicht wissen, wann sie auftritt.

    
deltheil 13.08.2013, 09:12
quelle
1

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) .

  • Verwendet einen Speicherpool für Elemente.
  • Buckets werden bei Bedarf (automatisch) erweitert.
  • Jedes Element benötigt 3 Zeiger (12 oder 24 Bytes pro Element).
  • Utility-Funktionen für Hashing-Strings, Pointer, Ints oder können optional vergleichen & amp; Hash-Callbacks.
  • Macht einen Iterator verfügbar (um alle Elemente im Ghash zu durchlaufen).
  • Gibt auch eine API BLI_gset basierend auf BLI_ghash frei, spart jedoch das Speichern eines Wertezeigers.

Weitere Ergänzungen:

  • Kann eine Größe reservieren, um zu verhindern, dass die Größe der Buckets geändert wird, wenn die Größe im Voraus bekannt ist.
  • Kann die Qualität der Hashing-Funktion berechnen (um zu testen, wie gleichmäßig die Buckets verteilt sind).

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

ersetzt werden     
ideasman42 07.08.2014 02:10
quelle

Tags und Links