【问题标题】:Hash Function for integers below 5000?5000以下整数的哈希函数?
【发布时间】:2011-12-30 04:09:02
【问题描述】:

为小于 5000 的整数生成唯一哈希值的最佳和最简单的哈希函数是什么?

实际问题是我有一个大小约为 50 的整数数组,其中包含 1 到 5000 之间的值。现在我必须进行反向映射,即给定一个值,我必须找出存储它的索引。我知道它可以通过使用二进制搜索来完成,因为我的数组是排序的。

请不要为 C 推荐任何哈希库。

【问题讨论】:

  • 为什么不能用数字作为自己的哈希?
  • @Blender:是的,有可能,但在这种情况下,我必须创建一个大小为 5000 的哈希表,这就是我来这里寻找更好方法的原因。如果我没有得到任何东西,我只会去。
  • 如果数字范围为1...5000,那么就有5000 可能的哈希值(假设您想要唯一的哈希值,这对搜索很有意义)。无论哪种方式,您都将创建 5000 哈希,那么为什么不采用简单的解决方案呢?
  • @blender:实际上我有一个固定大小为 50 的常量数组,它的值在项目的整个生命周期中不会改变。所以我已经有了一组值,我只想为这些值生成唯一的哈希。如果是一般情况,那么您所说的绝对正确。如果你想要这些值,我也可以提供。

标签: c hashmap hashtable hash


【解决方案1】:

除非 8 位 (char) 值的 5 KB 数组空间太大,否则不要打扰哈希 - 使用数字作为字符数组的索引,存储 1 表示该数字是已使用,0 表示未使用。您可以通过将数组用作位图(因此您需要大约 625 个字节来存储 5000 位)来进一步减少它,再加上一些代码来计算要查看的正确位位置。

或者,假设您需要在 50 个整数的数组中查找索引,请使用 5 KB 的空间将索引存储到 50 个整数的数组中,也许 -1 表示该数字未使用。

int main_array[50];
signed char aux_array[5000];

// initialize aux_array to all -1
for (int i = 0; i < sizeof(aux_array); i++)
    aux_array[i] = -1;
// for each value `v` in main_array, store its index `i` in `aux_array[v]`
for (int i = 0; i < num_values; i++)
{
    int v = main_array[i];
    if (aux_array[v] != -1)
        ...non-unique data in main_array...
    aux_array[v] = i;
}

反向查找检查aux_array 以查看索引是-1(不存在)还是非负以指示找到它的位置。这是一个倒排索引。如果您最终需要超过 127 个值,则可以切换到 unsigned charshort 而不是 signed char(适当调整标记值,在我的示例中为 -1)。

散列可能不划算。

【讨论】:

  • 实际上我有一个固定大小为 50 的常量数组,它的值在项目的整个生命周期中不会改变。所以我已经有了一组值,我只想为这些值生成唯一的哈希。如果是一般情况,那么您所说的绝对正确。如果你想要这些值,我也可以提供。
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
相关资源
最近更新 更多