回答
一个简单的解决方案是将输入分成4个5位块并异或。
该计算等同“打破输入到5个比特的4个块和XOR他们”由Barmar的建议,但可能是一点点更有效(其中x
是输入):
t = x^(x>>10);
result = (t^(t>>5)) & 31;
然而,XOR方法通常不会像Crocker提到的方程那样搅拌和混合原始的20位。在某些机器上,这种方法比Crocker更快,反之亦然。
jwapt7,这个符号是什么意思>>? – 2013-05-07 18:22:56
在C中,>>是一个算术右移。有效地,t >> 5是t/32。请参见[维基百科文章](http://en.wikipedia.org/wiki/Arithmetic_shift)中的表格“各种编程语言中的算术移位运算符”。 – 2013-05-07 18:31:40
((x * 1772 + 271828182) % 314159) & 31
你真的需要一个:编辑:原创或新算法? (即这是一个学校作业)。
您可以使用标准库的随机数生成器并为您的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)
}
事实上,它并没有mattter.The事情是我将在FPGA中使用它,所以我将使用VHDL,所以C库不是非常有用:( – 2013-05-07 19:48:13
好吧,如果你在硬件上做这个XOR解决方案看起来很理想 – 2013-05-08 09:57:57
@Peter Webb - 直XOR解决方案远非理想,由于XOR的对称属性,它会产生一些非常明显的冲突0xFF XOR 0x00 == 0x00异或0xFF – 2013-05-08 12:27:56
- 1. MD5哈希函数输出垃圾
- 2. 一位数字输入结果到两位数输出组件
- 3. 的YUICompressor - 压缩多输入多输出
- 4. 哈希输出的Perl哈希
- 5. 输出压缩HTML
- 6. SPHINX输出压缩?
- 7. YUI压缩机 - 压缩多个输入文件到一个输出文件
- 8. 位置哈希
- 9. 确定双哈希函数给定键 - >哈希位置值
- 10. 在Rails中,什么是压缩哈希到嵌套哈希
- 11. 使用g4压缩压缩输出tiff
- 12. 从gc到哈希表的输出值
- 13. CRC16哈希函数,用于计算来自两个输入的哈希值
- 14. Perl的哈希输出数组,如表
- 15. 输入不同的nchar向量并输出到四位数
- 16. 使用GZip压缩输出
- 17. ElasticMapReduce流式压缩输出
- 18. Python函数,将输入到64位,然后更改为8bytes输出
- 19. 压缩 - 位
- 20. 影响输出的函数的位置
- 21. tensoflow word2vec_basic输入输出占位符
- 22. 压缩输入流Java
- 23. 压缩2位数并保存1位使用压缩方案
- 24. Django get_or_create将输出压缩到shell
- 25. 哈希算法,最多20个字符的字母数字输出
- 26. 将哈希函数的输出分配给变量
- 27. 输出长度长的PHP哈希函数?
- 28. 使用哈希表作为函数输入
- 29. 缩放位图输出扭曲图像
- 30. 如何输出小数点后20位的Double?
一次取出输入流4位。 XOR每一位并输出结果。 – 2013-05-07 17:08:30
你需要*任何*散列算法,或者*好*一个? 5比特很小,你会得到愚蠢的。你可以做各种事情:取第一个/最后5位。做一些计算的位。总是返回“1”。有许多现有的散列函数可以使用,但可能会比这些选择更好。 :) – Joe 2013-05-07 17:09:05
在很大程度上取决于你的输入是如何分布的,但两个明显的选择是4倍xor和mod-31 – 2013-05-07 17:09:12