我主要對字符串鍵感興趣。有人能指向我的圖書館嗎?在C中尋找一個好的散列表實現
回答
對於字符串,Judy Array可能是好的。
Judy數組是一個複雜但速度非常快的關聯數組結構,用於使用整數或字符串鍵存儲和查找值。與普通數組不同,Judy數組可能很稀疏;也就是說,它們可能有大量未分配的索引。
這裏是一個Judy library in C。
提供實現稀疏動態數組的最先進核心技術的C庫。 Judy數組被聲明爲一個空指針。 Judy數組只有在填充時纔會消耗內存,但如果需要,它可以增長以充分利用所有可用內存。
其他參考資料,
這Wikipedia hash implementation reference有一些C
開放源代碼的鏈接。
另外,cmph - 在C
最小完美散列庫,支持幾種算法。
從未使用過它,但Google Sparsehash可能工作
http://www.cl.cam.ac.uk/~cwc22/hashtable/
定義函數
* create_hashtable
* hashtable_insert
* hashtable_search
* hashtable_remove
* hashtable_count
* hashtable_destroy
使用示例
struct hashtable *h;
struct some_key *k;
struct some_value *v;
static unsigned int hash_from_key_fn(void *k);
static int keys_equal_fn (void *key1, void *key2);
h = create_hashtable(16, hash_from_key_fn, keys_equal_fn);
insert_key = (struct some_key *) malloc(sizeof(struct some_key));
retrieve_key = (struct some_key *) malloc(sizeof(struct some_key));
v = (struct some_value *) malloc(sizeof(struct some_value));
(You should initialise insert_key, retrieve_key and v here)
if (! hashtable_insert(h,insert_key,v))
{ exit(-1); }
if (NULL == (found = hashtable_search(h,retrieve_key)))
{ printf("not found!"); }
if (NULL == (found = hashtable_remove(h,retrieve_key)))
{ printf("Not found\n"); }
hashtable_destroy(h,1); /* second arg indicates "free(value)" */
404錯誤。你會更新鏈接嗎? – 2013-01-04 21:12:19
下載tcl和使用他們的時間證明TCL散列函數。這很容易。 TCL API是有據可查的。
C Interfaces and Implementations討論了C中的哈希表實現。源代碼是available online。 (我的書的副本是在工作,所以我不能更具體)。
感謝您介紹本書。剛剛在亞馬遜下了訂單。 – 2013-01-04 21:11:20
GLib是一個偉大的圖書館,作爲您的C項目的基礎。他們有一些不錯的數據結構產品,包括哈希表:http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html(鏈接更新2011年4月6日)
的gperf - 完美的哈希函數發生器
http://www.ibm.com/developerworks/linux/library/l-gperf.html
戴夫·漢森的C Interfaces and Implementations包括罰款哈希表和幾個其他精心設計的數據結構。還有一個不錯的字符串處理界面。如果你負擔得起,這本書是非常棒的,但即使沒有,我也發現這個軟件設計得非常好,足夠小,可以完整地學習,並且可以輕鬆地在幾個不同的項目中重複使用。
stl具有map和hash_map(hash_map僅在某些實現中),如果您能夠使用C++,它們是值的關鍵。
,因爲我問這個問題很長一段時間已經過去了......現在我可以我自己的公共域庫添加到列表:
我有同樣的需求,做了一些研究,並最終使用libcfu
它簡單易讀,所以如果我需要修改,我可以做到這一點,而無需花費太多時間來理解。它也是BSD許可證。無需改變我的結構(以嵌入說下一個指針)
我不得不拒絕理由如下(我個人的原因,情況因人而異)其它選項:
- sglib - >這是宏迷宮我很不習慣使用宏來調試/製作 這樣一個代碼庫的變化
- cbfalconer - >很多許可redflags,並且該網站被關閉並且在網上關於支持/作者的討論太多;不想承擔風險
- google sparce-hash - >如前所述,這是針對C++的,而不是C
- glib(gnome hash) - >看起來非常有前途;但我找不到安裝開發工具包的簡單方法;我只需要在C例程/文件 - 而不是完全成熟的研究與開發環境
- 朱迪 - >似乎是一個簡單的使用太複雜..還沒有準備調試自己,如果我不得不遇到任何問題
- npsml(在這裏提到) - >找不到源
- strmap發現非常簡單和有用 - 它太簡單了,鍵和值都必須是字符串;價值是字符串似乎太限制(應接受無效*)
- uthash - >似乎很好(已在維基百科上提到散列表);發現它需要對結構進行修改 - 不想這樣做,因爲性能並不是我使用的關注點 - 它更多的是開發速度。
總結爲非常簡單的使用strmap是好的; uthash如果你關心額外的內存使用。如果只是開發速度或易用性是主要目標,libcfu會勝出[注意libcfu在內部做內存分配以維護節點/散列表]。令人驚訝的是沒有很多簡單的C哈希實現可用。
Apache的APR庫有自己的hash-implementation。它已經被移植到Apache運行的任何東西上,並且Apache license也相當自由。
khash。從samtools H/BWA/seqtk/klib
捲曲https://raw.github.com/attractivechaos/klib/master/khash.h
- 1. 在JS中尋找布萊克 - 512散列算法的實現
- 2. C的散列表實現C
- 3. 在C#中尋找後綴樹實現?
- 4. 實現一個列表C
- 5. 尋找一個好的VBA樹形圖實現
- 6. 在Python/Plone中尋找一個簡單的郵件列表/論壇實現
- 7. C++ Blowfish散列實現
- 8. 尋找一個列表的內容,在另一個列表
- 9. 在C++中尋找好的調試器
- 10. 在c實現的散列表中存儲整數?
- 11. 尋找一箇中等強度的散列函數
- 12. 尋找一個離散函數的逆
- 13. 尋找這個單元測試的更好的實現
- 14. 尋找一個無界的,基於隊列,並實現爲java.util.Set
- 15. 尋找數據包描述語言(最好使用C#實現)
- 16. 尋找SLAB6實現
- 17. 尋找一個能同時訪問多個數據庫的好實現
- 18. 實現一個好的C++ 0x error_condition?
- 19. 尋找一個C#的LINQ
- 20. 在C#和asp.net尋找一個很好的多線程資源
- 21. 如何在c中的鏈表中實現一個隊列?
- 22. 好散列碼,等於一個具有多個整數值的鍵的實現
- 23. C散列表實現中的內存泄漏
- 24. 在C++中實現在無向圖算法中尋找循環
- 25. C++中的列表實現
- 26. 在C++中尋找一個MemoryStream
- 27. 在C中尋找一個自然數#
- 28. 尋找一個好的數據庫結構來實現Facebook/SO的通知
- 29. 尋找一個快速的散列函數
- 30. 尋找一個值得祝福的散列值
我認爲sparsehase用C++編寫。 – 2009-07-16 16:37:16
我認爲你是對的 – Nick 2009-07-16 17:14:41
事實上,在這種情況下C是感興趣的語言 - 而不是C++。 – SetJmp 2009-07-17 00:37:34