我需要提出一个哈希函数的算法,该算法需要20位长的输入,输出应该只有5位长。
我上周在互联网上搜索过,但找不到任何帮助。
非常感谢您的帮助。感谢
答案 0 :(得分:2)
一个简单的解决方案是将输入分成4个5位的块并对它们进行异或。
答案 1 :(得分:0)
这个计算相当于“按照Barmar的建议将输入分成4个5位块并对它们进行异或”,但可能效率更高(其中x
是输入):
t = x ^ (x>>10);
result = (t ^ (t>>5)) & 31;
然而,XOR方法通常不会像Crocker提到的方程那样搅拌和混合原始的20位。在某些机器上,这种方法比Crocker更快,反之亦然。
答案 2 :(得分:0)
((x * 1772 + 271828182) % 314159) & 31
答案 3 :(得分:-1)
您真的需要:编辑:原始或新的算法吗? (即这是一项学校作业)。
您可以使用标准库的随机数生成器并将其生成20位。它使用的算法绰绰有余。 What common algorithms are used for C's rand()?
选择其中一个标准实现,你应该没问题。下面的例子就是生活在野外(非便携式)。由于rand实现根据编译器或库的版本而有所不同,如果你使用它们用于通用的东西,你使用哈希将不会匹配,但我的赌注是你只需要一个运行时消息校验和或者它是一个学校作业。
#include <time.h>
#include <stdlib.h>
...
int compress20To5(int input) {
srand( input );
return rand() & 0x1f; // mask last 5 bits 0x1f (11111b)
}