2013-05-07 45 views
0

我需要提出一个哈希函数的算法,需要20位长输入和输出应该只有5位长。哈希函数,压缩20位输入到5位输出

我在网上搜索了上周的内容,但却找不到有用的东西。

您的帮助非常感谢。谢谢

+3

一次取出输入流4位。 XOR每一位并输出结果。 – 2013-05-07 17:08:30

+4

你需要*任何*散列算法,或者*好*一个? 5比特很小,你会得到愚蠢的。你可以做各种事情:取第一个/最后5位。做一些计算的位。总是返回“1”。有许多现有的散列函数可以使用,但可能会比这些选择更好。 :) – Joe 2013-05-07 17:09:05

+0

在很大程度上取决于你的输入是如何分布的,但两个明显的选择是4倍xor和mod-31 – 2013-05-07 17:09:12

回答

2

一个简单的解决方案是将输入分成4个5位块并异或。

0

该计算等同“打破输入到5个比特的4个块和XOR他们”由Barmar的建议,但可能是一点点更有效(其中x是输入):

t = x^(x>>10); 
result = (t^(t>>5)) & 31; 

然而,XOR方法通常不会像Crocker提到的方程那样搅拌和混合原始的20位。在某些机器上,这种方法比Crocker更快,反之亦然。

+0

jwapt7,这个符号是什么意思>>? – 2013-05-07 18:22:56

+0

在C中,>>是一个算术右移。有效地,t >> 5是t/32。请参见[维基百科文章](http://en.wikipedia.org/wiki/Arithmetic_shift)中的表格“各种编程语言中的算术移位运算符”。 – 2013-05-07 18:31:40

0
((x * 1772 + 271828182) % 314159) & 31 
-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) 
} 
+0

事实上,它并没有mattter.The事情是我将在FPGA中使用它,所以我将使用VHDL,所以C库不是非常有用:( – 2013-05-07 19:48:13

+0

好吧,如果你在硬件上做这个XOR解决方案看起来很理想 – 2013-05-08 09:57:57

+0

@Peter Webb - 直XOR解决方案远非理想,由于XOR的对称属性,它会产生一些非常明显的冲突0xFF XOR 0x00 == 0x00异或0xFF – 2013-05-08 12:27:56