字典中使用了什么哈希函数(hash_table)?

时间:2012-10-04 17:52:05

标签: c++ hash dictionary hashtable hash-function

我正在写语言翻译。 有问题:我想创建类型字典,你可以通过索引放置任何类型的值,任何类型的值(简单[int,float,string]或简单类型的复杂[list,array,dictionary]或复杂的简单类型...)。就像在python-lang中一样。 我应该使用什么算法的哈希函数?

对于字符串,有许多哈希的例子 - 最简单的:所有字符的总和乘以31除以HASH_SIZE,这个简单的数字。

但对于不同的类型,我认为,它必须是更复杂的算法。 我找到SHA256,但不知道,如何使用“unsigned char [32]”结果类型在hash-table中进行地址 - 它远远超过计算机中的RAM。 谢谢。

2 个答案:

答案 0 :(得分:0)

嗯,常见的方法是将哈希函数定义为属于该类型的方法。 这样,您可以通过通用API为不同类型调用不同的算法。

当然,这需要您为要在解释器中使用的每个“c类型”定义包装类。

答案 1 :(得分:0)

C ++ 11中有哈希表,最新的C ++标准 - std :: unordered_map,std :: unordered_set。

编辑:

由于每种类型都有不同的分布,通常每种类型都有自己的散列函数。这是在Java(从Object继承的.hashCode()方法),C#,C ++ 11和许多其他实现中完成的。

EDIT2:

典型的哈希函数做两件事:

1。)以自然数创建对象表示。 (这是Java中的.hashCode()) 例如 - 字符串“CAT”可以转换为:

67 * 256^2 + 65 * 256^1 + 84 = 4407636

2。)将此数字映射到数组中的位置。 其中一种方法是:

integer_part(fractional_part(k*4407636)*m)

其中k是常数(Donald Knuth在他的书中推荐Art(sqrt(5)+1)/ 2),m是你的哈希表的大小,fractional_part和integer_part(显然)计算小数部分和整数部分实数。

在哈希表实现中,您需要处理冲突,尤其是当密钥多于哈希表大小时。

EDIT3:

我在这个主题上阅读了更多内容,看起来很像     67 * 256 ^ 2 + 65 * 256 ^ 1 + 84 = 4407636 做hash_code真的很糟糕。这是因为“somethingAAAAAABC”和“AAAAAABC”给出完全相同的哈希码。