我正在为编译器编写一些哈希函数,我经常使用__int64
数据类型。编译器旨在支持(并且到目前为止)在不同的OS上。我知道__int64
是一种可以由我的目标系统的大多数主要C ++编译器编译的类型,所以这不是问题。我正在使用哈希函数来使较大的字符串更小更快地进行比较,并且它们可以在64位功能的OS上运行奇迹;但是32位操作系统会有足够大的性能下降以取消好处吗?我可以使用32位整数,但这会大大降低散列函数的有效性。
编辑: 它是自定义代码,非常简单。第一个散列函数从12个字母数字(包括下划线)字符生成唯一的64位int。然后,类通过创建64位哈希的地址链接列表来处理超过12个字符的哈希值,并使比较运算符重载。重载的比较被短路并比较地址链接列表。我在我的机器上进行了测试,以比较随机生成的大散列(100 - 300个字符)与自身(最坏情况下的senario)相比的速度,并证明它比字符串比较更快。为了更好地模拟生成哈希的开销,我还运行了预先生成的大哈希的比较测试与自己进行比较。这一切都在关闭代码优化的情况下运行。通过大约10亿个哈希比较与大约10亿个字符串比较,哈希大约占用了16%的时间。但这完全是在64环境中。我没有使用
运行测试的32位计算机答案 0 :(得分:2)
在32位x86架构上,64位大小的整数基本上没有慢。显然,它们不如32位整数快,但速度并不明显。无论x86还是x64,使用64位int进行哈希都不是鲁莽的。与几个不需要的动态分配或失败的算法相比,额外的开销可能是最小的。
答案 1 :(得分:1)
我不认为比较四个32位变量会比比较两个64位变量更快,因为我猜编译器会产生最快的代码:如果你的处理器不支持64位操作,你的编译器将生成代码,分两步比较它,就像你手工做的那样 这当然取决于您的编译器。
无论如何,还有其他工具可以让你的比较更快,但是在任何地方都无法比较,例如矢量操作(由SSE扩展提供),它们允许一次比较8 * 4个字节。
如果您需要尽可能优化代码,我建议您添加一些预处理程序指令,以便仅在系统支持时才启用优化。
答案 2 :(得分:0)
你确定它会大大降低哈希函数的有效性吗?你有运行测试吗?当然,如果(i)散列的项数明显大于2 ^ 16并且(ii)计算64位散列是便宜的,则64位是比32位更好的散列。在您的情况下,(i)或(ii)(或两者)中的哪一个是真的?如果性能很重要,您可能希望根据底层操作系统使用不同的哈希函数。否则,我会说:写一个32位版本和一个64位版本;在64位系统和32位系统上尝试它们;而且你会看到它是否值得彻底消失。
答案 3 :(得分:0)
我使用的所有哈希函数都返回字节数组(uchar)中的值以避免您的问题。