XOR哈希如何运作+挑选一把钥匙

时间:2010-03-10 01:52:00

标签: hash indexing xor

我的任务是在Perl中为可变长度二进制字符串实现XOR哈希;长度可以在18到100之间。在我的理解中,我用一把钥匙对我的二进制字符串进行异或。我在网上阅读了两个不同的应用程序:

  1. 其中一个选项是如果我的密钥长度比字符串短,我将字符串分成块的长度;然后将它们全部折叠在一起(因此产生的散列的长度将是密钥的长度)。
  2. 我还读到你只是对字符串的每个键长度块进行异或(因此产生的散列将是字符串的长度)。
  3. 其中一个比另一个更正确吗?这是针对索引中的散列值,所以我倾向于认为第一个选项(可能产生短路哈希)会更好。

    最后,是否有一种生成足够随机密钥的好方法?根据要散列的字符串的长度,是否有一个很好的长度可供选择?

    编辑:顺便说一句,我非常清楚这个哈希有多糟糕。它仅用于比较目的。 :)

5 个答案:

答案 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的时间。