C 语言中的哈希数组技巧
我需要一些想法来为我的作业开发一个好的哈希函数。我有一份世界上所有国家(大约 190 个)的列表。每个国家的名称是哈希函数的关键。是否有人会推荐一种特定类型的哈希函数来将这些数据存储在哈希函数中而不会产生很多冲突?另外,您能否举一个如何实现它的例子?
I need some ideas to develop a good hashing function for my assignment. I have a list of all the countries in the world (around 190) in total. The names of each country is the key for the hashing function. Is there a specific kind of hashing function anyone would recommend to store this data in a hashing function without many collisions? Also, can you perhaps give an example of how to implement it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用GNU gperf。对于像您这样的输入,它将为您生成 C 代码,该代码实现完美的哈希函数(对于给定的输入)。没有碰撞,不用担心。
Use GNU gperf. For inputs like yours, it will generate C code for you which implements a perfect hash function (for the given inputs). No collisions, no worries.
您可以使用生成的完美哈希(GNU perf)。
如果字符串集是动态的,那么您可以使用三元特里树。
对于 N 个唯一的字符串,它将为您提供唯一的数字 [1..N]。对于您的情况,它会比哈希表更快。
这是我对此类事情的实现:
http://code.google.com/p/tiscript /source/browse/trunk/tool/tl_ternary_tree.h
You can use generated perfect hash for that (GNU perf).
Of if the set of strings is dynamic then you can use ternary trie.
For N unique strings it will give you unique number [1..N]. For your case it will be faster than with hash tables.
Here is my implementation of such thing:
http://code.google.com/p/tiscript/source/browse/trunk/tool/tl_ternary_tree.h
我能想到的最简单的方法是对每个国家/地区的名称计算其表示形式中 ASCII 值的总和,并将其用作哈希值:
如果您的哈希映射的大小为 N,则可以使用
map[hash 存储国家/地区名称(我的国家/地区)% N] = 我的国家/地区
。从概念上讲。只需尝试这种方法,看看生成的哈希值是否足够均匀分布。请注意,分布的质量也可能取决于 N。
The simplest approach I can think of is for each country's name to compute the sum of the ASCII values in its representation and use this as the hash value:
If your hash map has size N, you store country names with
map[hash(my_country) % N] = my_country
. Conceptually.Just try this approach and see whether the resulting hash values are sufficiently uniformly distributed. Note that the quality of the distribution may also depend on N.