我的任务是在Perl中为可变长度二进制字符串实现XOR哈希;长度可以在18到100之间。在我的理解中,我用一把钥匙对我的二进制字符串进行异或。我在网上阅读了两个不同的应用程序:
其中一个比另一个更正确吗?这是针对索引中的散列值,所以我倾向于认为第一个选项(可能产生短路哈希)会更好。
最后,是否有一种生成足够随机密钥的好方法?根据要散列的字符串的长度,是否有一个很好的长度可供选择?
编辑:顺便说一句,我非常清楚这个哈希有多糟糕。它仅用于比较目的。 :)答案 0 :(得分:3)
另一种选择,来自here(搜索XOR哈希)。
假设散列应该是x字节长,将消息分成x个字节的块;和他们在一起。这实际上与使用x 0的键的方法1相同。 (或者,从字符串的前x个字节的键开始,忽略字符串的第一个字节。各种有趣的方式来思考它)
(还要注意关于XOR哈希的说法,即它很糟糕。非常糟糕。)(粗略。它比替代品更好,但它不足以用于很多哈希值)
编辑:另一件小事;如果方法1在所有散列的二进制字符串中使用相同的键;那么关键是什么真的无关紧要。 xor'ing反对常数类似于ROT13。<sarcasm>
或者,如果您使用SHA1为每个字符串派生一个键...这可能会使XOR哈希更好。</sarcasm>
key xor key == 0 //always
key xor (((key xor msg1) xor msg2) xor msg3)
== (msg1 xor msg2 xor msg3)
答案 1 :(得分:1)
通常,您希望哈希值都是一致的长度。您描述的第二种方法听起来像要在哪里恢复数据的加密,第一种是单向散列。
答案 2 :(得分:1)
xor不是一个非常好的哈希方式:
1是一种哈希值,因为无论是否有密钥,您都无法获得原始数据。我建议使用sha2(224/256/384/512),md5,ripemd160或漩涡,如果可以的话
2是带有重复键的xor密码。它绝对不是哈希。
至于生成随机数,你可以找到以十六进制生成无理数的程序(如pi:3.243F6A8885A308D313198A2E03707344A4093822299 ....)
答案 3 :(得分:0)
第一种技术可用于创建字符串的快速和脏哈希。
第二种技术可用于创建字符串的快速,脏和非常不安全的对称加密。
如果你想要哈希,请使用第一种方法(或者更好,选择现成的哈希函数。)
密钥的随机性不是你最大的问题 - 整个技术都是不安全的。
密钥越长,您获得的哈希值越明显,您发生冲突的可能性就越小。不久之后,对于中等大小的数据集来说,碰撞非常罕见。
答案 4 :(得分:0)
如果你想执行一个只使用XOR的'hash',我只需将字符串分割成一些预定大小为X的块。不要忘记以某种方式补偿输入字符串小于X的时间。