找到所有散列到相同散列值的n个键

时间:2018-02-16 14:09:33

标签: java random hash collision

给出哈希函数:

public int hash4(int k) {
    Random rand = new Random(k);
    return rand.nextInt(size);
}

目标是找到使用此散列函数散列到相同散列值的n(大小)数量的键(k)(导致冲突)。大小是一个由用户传入的常量,大小永远不会大于1000.一个键的最大值是n ^ 2,你不能一遍又一遍地使用相同的键。任何帮助将不胜感激!

我尝试解决此问题的过程是使用数字1-n作为键从1循环到n,寻找模式。

1 个答案:

答案 0 :(得分:1)

鉴于有n个桶,n 2 键,使用pigeonhole principle,我们知道一个桶至少有n个键

要解决这个问题,我们需要遍历所有键

int keys = n * n;
for(int i = 0; i < keys; i++)

接下来,我们看看哪些键碰撞是将每个键存储在每个碰撞组的列表/集中

List<List<Integer>> collisions = new ArrayList<List<Integer>>(n);
for(int i = 0; i < n; i++)
    collisions.add(new LinkedList<Integer>());
collisions.get(hash(key)).add(key);

一旦我们完成所有碰撞,就可以轻松查找至少有n次碰撞的列表

for(List<Integer> collision : collisions)
    if(collision.size() >= n)
        return collision; //or just print

全部放在一起......

List<Integer> findCollisions(int n)
{
    List<List<Integer>> collisions = new ArrayList<List<Integer>>(n);
    for(int i = 0; i < n; i++)
        collisions.add(new LinkedList<Integer>());
    int keys = n * n;

    for(int i = 0; i < keys; i++)
        collisions.get(hash(i)).add(i);

    for(List<Integer> collision : collisions)
        if(collision.size() >= n)
            return collision;
    return null; //this should never happen, due to pigeonholes, but compiler doesn't know
}