Java 特定整数集的哈希函数

Java 特定整数集的哈希函数,java,arrays,hash,Java,Arrays,Hash,我有一组特定的整数,它们是:2,10,13,15,23,34,43,58,100,123,199,200和348。任务是创建一个1行哈希函数,该函数至少可以映射索引0到12中的9个值 到目前为止,我制作的哈希函数是: hash=value%13 hash=(值+数组[indexOfValue])%13 hash=array[indexOfValue] 第三个问题可能会让我挨骂,但我似乎可以接受,所以我不妨给出一个答案。哦,我不应该使用任何冲突解决方法 编辑:那么关于我应该使用什么散列函数有什么建

我有一组特定的整数,它们是:2,10,13,15,23,34,43,58,100,123,199,200和348。任务是创建一个1行哈希函数,该函数至少可以映射索引0到12中的9个值

到目前为止,我制作的哈希函数是:

  • hash=value%13
  • hash=(值+数组[indexOfValue])%13
  • hash=array[indexOfValue]
  • 第三个问题可能会让我挨骂,但我似乎可以接受,所以我不妨给出一个答案。哦,我不应该使用任何冲突解决方法

    编辑:那么关于我应该使用什么散列函数有什么建议吗

    编辑:我发现一个函数可以将所有值从0映射到12,它是:
    (((x*7)+x)%7)+x)%13

    我(受过教育的)猜测XOR将是这里哈希函数的良好基础。例如:

    (value ^ c) % 13
    
    通过尝试上述公式中[1200]中c的所有值(蛮力),并计算为集合中的值生成的不同哈希代码的数量,得到了数字
    72
    。例如

    int[] values = new int[]{2, 10, 13, 15, 23, 34, 43, 58, 100, 123, 199, 200, 348};
    for (int value : values) {
        System.out.print((value ^ 72) % 13);
    }
    
    将打印:

    9 1 4 6 4 2 8 10 5 12 0 11 3
    

    这包括[0,12]范围内的所有数字,除了7和4出现两次之外。

    你的问题是什么?@m_callens抱歉,我现在已经编辑了它。投票结束是因为需要有自以为是的答案。有趣的是,单行哈希函数要求消除了双哈希选项。也许一个精心挑选的大素数可以用于散列?@MichaelShopsin该数字不需要是素数,也不需要特别大,因为任何高于348的数字都会给出一个完美的散列;-);-);-)13个可能的值包含13个元素,因此重复不是不可避免的。如果您对映射所有值的函数仍感兴趣,我发现了一个:hash=(((x*7)+x)%7)+x)%13