C++ 将32位数字快速散列到数组中

C++ 将32位数字快速散列到数组中,c++,hash,C++,Hash,我正在寻找一个快速关联数组,它允许我将一个32位的数字映射到数组中的某个元素,最好是唯一的,这样就不会有任何冲突。这些数字只有几千个左右,但它们可以在32位范围内的任何地方 当然,我可以使用std::map或std::unordered_map,但我希望有一个完美的哈希解决方案来解决这个问题,可以大大加快速度。如果只有几千个,也可以在数组中仅使用std::find并存储std::pair键值 作为参考,我想做的是将消息ID映射到函数指针表。如果您重新阅读您的问题,它可能会自己回答。你基本上已经问

我正在寻找一个快速关联数组,它允许我将一个32位的数字映射到数组中的某个元素,最好是唯一的,这样就不会有任何冲突。这些数字只有几千个左右,但它们可以在32位范围内的任何地方

当然,我可以使用std::map或std::unordered_map,但我希望有一个完美的哈希解决方案来解决这个问题,可以大大加快速度。如果只有几千个,也可以在数组中仅使用std::find并存储std::pair键值


作为参考,我想做的是将消息ID映射到函数指针表。

如果您重新阅读您的问题,它可能会自己回答。你基本上已经问过,给定一组完全随机的32位整数,如何将它们转换成32位整数。如果它们确实是随机的,并且您不能容忍任何冲突,那么只有一个答案:hash(x)=x


当然,这个答案对你没有任何好处。另一种选择是利用有关消息ID性质的知识。它们几乎是连续的吗?散列(x)=x-someConstant。你能扔掉一些碎片吗?散列(x)=(x&~0xff)>>8。也许这会给你一些想法

消息ID是连续的吗?不幸的是不是。我可以补充一点,我不介意这里涉及的“设置”时间,因为一旦配置了关联,就不会有添加或删除。有一个完美的散列,它适合这种情况,但它不是运行时的事情。你需要一个离线算法从可能的输入推断出完美的散列函数。你是对的,它们不是完全随机的(从我的阅读中,我模糊地理解熵与解决方案有关)。它们大多小于5000,有一些特殊情况可能在范围内的任何地方。如果x为,则特殊情况哈希函数可能返回x