0

我正在写语言的解释器。有问题:我想创建类型字典,您可以在其中按索引放置任何类型的值,任何类型的值(简单类型的简单 [int,float,string] 或复杂 [list,array,dictionary] 或复杂的简单类型...)。这与 python-lang 中的相同。我应该使用什么哈希函数算法?

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

但是对于不同的类型,我认为,它必须是更复杂的算法。我找到了 SHA256,但不知道如何使用“unsigned char [32]”结果类型在哈希表中进行寻址 - 它比计算机中的 RAM 多得多。谢谢你。

4

2 回答 2

0

好吧,一种常见的方法是将散列函数定义为属于该类型的方法。这样你就可以通过一个通用的 API 为不同的类型调用不同的算法。

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

于 2012-10-05T17:27:07.360 回答
0

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

编辑:

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

编辑2:

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

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

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

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

integer_part(fractional_part(k*4407636)*m)

其中 k 是一个常数(Donald Knuth 在他的《编程艺术》一书中推荐 (sqrt(5)+1)/2),m 是哈希表的大小,fractional_part 和 integer_part (显然)计算实数的小数部分和整数部分.

在您的哈希表实现中,您需要处理冲突,尤其是当可能的键比哈希表的大小多得多时。

编辑3:

我阅读了有关该主题的更多内容,看起来 67 * 256^2 + 65 * 256^1 + 84 = 4407636 是执行 hash_code 的非常糟糕的方法。这是因为,“somethingAAAAAAABC”和“AAAAAABC”给出完全相同的哈希码。

于 2012-10-05T17:44:41.457 回答