2

我的任务是在 Perl 中为可变长度的二进制字符串实现 XOR 哈希;长度可以从 18 到超过 100。根据我的理解,我用一个键对我拥有的二进制字符串进行异或运算。我已经在网上阅读了这两个不同的应用程序:

  1. 一种选择是,如果我的密钥长度比字符串短,我将字符串分成与密钥长度相同的块;然后将它们全部折叠在一起(因此结果哈希的长度将是密钥的长度)。
  2. 我还读到您只是对字符串的每个键长度块的键进行异或运算(因此生成的哈希将是字符串的长度)。

其中一个比另一个更正确吗?这是用于索引中的散列值,所以我倾向于认为第一个选项(可能产生短散列)会更好。

最后,有没有生成足够随机密钥的好方法?根据要散列的字符串的长度,是否有合适的长度来选择密钥?

编辑:顺便说一句,我非常清楚这个哈希值有多糟糕。严格来说是为了比较。:)

4

5 回答 5

3

另一种选择,从这里(搜索 XOR 散列)。

假设哈希应该是 x 字节长,将消息分成 x 字节的块;并将它们异或在一起。这实际上与使用带有 x 0 键的方法 1 相同。(或者,或者,从字符串的前 x 个字节的键开始,并忽略字符串的那些第一个字节。各种有趣的方式来思考它)

(还要注意关于 XOR 散列的说法,即它很糟糕。非常糟糕。)(粗略地说。它比替代品更好,但对于很多散列的用途来说,这还不够)

编辑:另一件小事;如果方法 1 在所有经过哈希处理的二进制字符串中使用相同的密钥;那么关键是什么并不重要。对常数进行异或类似于ROT13<sarcasm>或者,如果您使用 SHA1 为每个字符串派生一个密钥……这可能会使 XOR 散列更好。</sarcasm>

key xor key == 0 //always
key xor (((key xor msg1) xor msg2) xor msg3) 
== (msg1 xor msg2 xor msg3)
于 2010-03-10T02:01:35.360 回答
1

通常,您希望您的哈希值都具有一致的长度。您描述的第二种方法听起来像是要恢复数据的加密,第一种方法是单向哈希。

于 2010-03-10T01:58:16.867 回答
1

xor 不是一个很好的哈希方法:

1 是一种哈希,因为无论有没有密钥,您都无​​法取回原始数据。如果可以的话,我建议使用 sha2 (224/256/384/512)、md5、ripemd160 或漩涡

2 是具有重复密钥的异或密码。它绝对不是哈希。

至于生成随机数,您可以找到以十六进制生成无理数的程序(例如 pi: 3.243F6A8885A308D313198A2E03707344A4093822299 ....)

于 2010-03-10T02:02:14.627 回答
0

第一种技术可用于创建字符串的快速和脏散列。

第二种技术可用于创建快速、肮脏且极不安全的字符串对称加密。

如果你想要一个散列,使用第一种方法(或者更好的是,选择一个现有的散列函数现成的。)

密钥的随机性不会成为你最大的问题——整个技术是不安全的。

密钥越长,您获得的哈希值越不同,发生冲突的可能性就越小。对于中等大小的数据集,很快就会发生碰撞。

于 2010-03-10T01:57:48.380 回答
0

如果您想执行仅使用 XOR 的“哈希”,我只需将字符串拆分为某个预定大小 X 的块。当输入字符串小于 X 时,不要忘记以某种方式进行补偿。

于 2010-03-10T02:10:07.027 回答