对于字符串,有许多哈希的例子 - 最简单的:所有字符的总和乘以31除以HASH_SIZE,这个简单的数字。
但对于不同的类型,我认为,它必须是更复杂的算法。 我找到SHA256,但不知道,如何使用“unsigned char [32]”结果类型在hash-table中进行地址 - 它远远超过计算机中的RAM。 谢谢。
答案 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”给出完全相同的哈希码。