我有这个公式:
index = (a * k) % M
将数字' k'从不同数字的输入集K映射到哈希表中的位置。我想知道如何写一个非暴力的程序,找到这样的' M'和' a'所以' M'是最小的,并且给定集合K没有碰撞。
答案 0 :(得分:1)
如果,而不是数字乘法,你可以执行逻辑计算(和/或/不),我认为最优解(M的最小值)将是小到card(K)
如果你能得到一个函数,它将K的每个值(一旦有序)与它在集合中的位置相关联。
理论上,必须可以为这样的关系(比特一点)写一个真值表,然后用适当的程序通过卡诺表简化minterms。根据所需的位数,计算复杂性是否可承受......或者不是。
答案 1 :(得分:0)
如果a是M的共同素数,那么a * k = a * k' mod M当且仅当k = k' mod M,所以你不妨使用a = 1,它总是与M共同素数。这也涵盖了M是素数的所有情况,因为除了0之外的所有数字都是M的共同素数。
如果a和M不是共同素数,那么它们共有一个共同因子,比如b,所以a = x * b和M = y * b。在这种情况下,乘以a的任何东西也可以被b mod M整除,你可能也可以使用mod y而不是mod M,所以通过使用一个非共同素数来获得M没有任何东西可以获得。
因此,对于您所述的问题,您可以通过保留= 1并尝试所有可能的M值来节省一些时间。
如果你是使用32位整数并且真的计算不是(a * k)mod M但是((a * k)mod 2 ^ 32)mod M你可能能够找到除1之外的值比a = 1更好的情况因为在(a * k)mod 2 ^ 32中发生了什么。