C 将20位输入压缩为5位输出的哈希函数

C 将20位输入压缩为5位输出的哈希函数,c,algorithm,C,Algorithm,我需要想出一个哈希函数的算法,它需要20位长的输入,而输出应该只有5位长 我在网上搜索了一周,没有找到任何有用的东西 非常感谢你的帮助。感谢一个简单的解决方案是将输入分成4个5位的块并对其进行异或运算。此计算相当于Barmar建议的“将输入分成4个5位的块并对其进行异或运算”,但可能更为有效(其中,x是输入): 然而,XOR方法通常不会像Crocker提到的等式那样搅动和混合原始的20位。在某些机器上,这种方法会比Crocker的更快,在其他机器上也会比Crocker的更快。您真的需要:编辑:原

我需要想出一个哈希函数的算法,它需要20位长的输入,而输出应该只有5位长

我在网上搜索了一周,没有找到任何有用的东西


非常感谢你的帮助。感谢

一个简单的解决方案是将输入分成4个5位的块并对其进行异或运算。

此计算相当于Barmar建议的“将输入分成4个5位的块并对其进行异或运算”,但可能更为有效(其中,
x
是输入):


然而,XOR方法通常不会像Crocker提到的等式那样搅动和混合原始的20位。在某些机器上,这种方法会比Crocker的更快,在其他机器上也会比Crocker的更快。

您真的需要:编辑:原始算法还是新算法?(这是学校的作业)

((x * 1772 + 271828182) % 314159) & 31
您可以使用标准库的随机数生成器,并将其作为20位的种子。它使用的算法将是足够的

只要选择一个标准实现,您就可以了。下面的例子就是生活在野外(不可移动)。由于rand实现因编译器或库版本的不同而不同,因此如果您将哈希用于通用的内容,则使用哈希将不匹配,但我打赌您只需要运行时消息校验和,或者这是学校作业

#include <time.h>
#include <stdlib.h>
...
int compress20To5(int input) {
    srand( input );
    return rand() & 0x1f; // mask last 5 bits 0x1f (11111b)
}
#包括
#包括
...
整数压缩20到5(整数输入){
srand(输入);
return rand()&0x1f;//屏蔽最后5位0x1f(11111b)
}

一次获取4位输入流。对每一位进行异或运算并输出结果。您需要哈希算法还是好的算法?5位很小,您将有重复。你可以做各种各样的事情:取前/后5位。对位进行一些计算。始终返回“1”。但是,您可以使用许多现有的哈希函数,这些函数可能比这些选择更好。:)很大程度上取决于输入的分布方式,但有两个明显的选择是4倍xor和mod-31Easy答案:复制前5位并丢弃下15位JWAPT7,您所说的符号>>是什么意思?在C中,>>是一个算术右移。实际上,t>>5是t/32。请参阅中的表“各种编程语言中的算术移位运算符”。事实上,它并不是mattter。问题是我将在FPGA中使用它,因此我将使用VHDL,因此C库不是很有用:(如果你在硬件中这样做,那么XOR解决方案看起来很理想。@Peter Webb-直XOR解决方案远不是理想的,它会由于XOR的对称属性而产生一些非常明显的冲突。0xFF XOR 0x00==0x00 XOR0xFF@JohnStufy-如果你按照我的答案中的链接,你会看到相关的SO问题,它有实际的实现对于那些被引用的C库实现,您可以选择(复制并粘贴)其中一个实现到您自己的代码中。
#include <time.h>
#include <stdlib.h>
...
int compress20To5(int input) {
    srand( input );
    return rand() & 0x1f; // mask last 5 bits 0x1f (11111b)
}