1

我正在为编译器编写一些哈希函数,并且__int64经常使用该数据类型。该编译器旨在在不同的操作系统上得到支持(到目前为止也是如此)。我知道这__int64是一种可以由大多数主要 C++ 编译器为我的目标系统编译的类型,所以这不是问题。我正在使用散列函数来使大字符串更小、更快地进行比较,它们在支持 64 位的操作系统上创造了奇迹;但是在 32 位操作系统上是否会有足够大的性能下降来抵消这些好处?我可以使用 32 位整数,但这样会大大降低散列函数的有效性。

编辑:这是自定义代码,非常简单。第一个哈希函数从 12 个字母数字(包括下划线)字符生成一个唯一的 64 位 int。然后一个类通过创建 64 位哈希的地址链表和重载比较运算符来处理超过 12 个字符的哈希。重载的比较被短路并向下比较地址链表。我已经在我的机器上进行了测试,以比较随机生成大散列(100 - 300 个字符)的速度与它们自身(最坏情况下的情况)相比,它被证明比字符串比较更快。为了更好地模拟生成哈希的开销,我还运行了预先生成的大哈希的比较测试,并与它们本身进行比较。这一切都是在关闭代码优化的情况下运行的。使用约 10 亿个哈希比较与约 10 亿个字符串比较,哈希花费了大约 16% 的时间。不过,这一切都在 64 位环境中。我没有 32 位机器来运行测试

4

4 回答 4

2

在 32 位 x86 架构上,64 位大小的整数根本不会慢很多。显然,它们没有 32 位整数那么快,但也没有特别慢。无论是 x86 还是 x64,使用 64 位 int 的哈希值都不是鲁莽的。与几个不需要的动态分配或失败的算法相比,额外的开销可能很小。

于 2011-01-12T17:58:43.953 回答
1

我不认为比较四个 32 位变量会比比较两个 64 位变量更快,因为我猜编译器会生成最快的代码:如果你的处理器不支持 64 位操作,你的编译器会生成分两步比较它的代码,就像你手动做的一样。
这当然取决于你的编译器。


无论如何,还有其他工具可以让您的比较更快,但并非在任何地方都可用,例如矢量运算(由 SSE 扩展提供)允许一次比较甚至 8*4 字节。

如果您需要尽可能优化代码,我建议您添加一些预处理器指令,以便仅在系统支持时启用优化。

于 2011-01-12T17:57:56.667 回答
0

我使用的所有哈希函数都返回字节数组(uchar)中的值以避免您的问题。

于 2011-01-12T18:22:24.773 回答
0

您确定它会大大降低哈希函数的有效性吗?你有运行测试吗?如果 (i) 散列的项目数明显多于 2^16 并且 (ii) 计算 64 位散列很便宜,那么 64 位当然是比 32 位更好的散列。在您的情况下,(i)或(ii)(或两者)哪个是正确的?如果性能很重要,您可能希望根据底层操作系统使用不同的哈希函数。否则,我会说:写一个32位版本,一个64位版本;在 64 位系统和 32 位系统上试用它们;你会看到是否值得大吃一惊。

于 2011-01-12T17:57:50.770 回答