我有一段时间试图理解这一点。例如,MD5 或 SHA1 如何对字符串进行散列并且只返回字母数字字符。我的意思是,如果我没有完全关闭,他们都或至少 MD5 将字符串转换为二进制,然后附加任何缺失的内容以便能够将其分割成 512 个字符的块。然后它执行一系列操作,其中一个是对每个块的 32 个单词中的一个进行 XOR。我的意思是,最后得到字母数字字符不可能是纯粹的运气,XOR 必须产生其他东西?
有人可以向我解释一下,甚至提供一个小例子,其中有人在 java 或 php 中 XOR 的字符串?
我有一段时间试图理解这一点。例如,MD5 或 SHA1 如何对字符串进行散列并且只返回字母数字字符。我的意思是,如果我没有完全关闭,他们都或至少 MD5 将字符串转换为二进制,然后附加任何缺失的内容以便能够将其分割成 512 个字符的块。然后它执行一系列操作,其中一个是对每个块的 32 个单词中的一个进行 XOR。我的意思是,最后得到字母数字字符不可能是纯粹的运气,XOR 必须产生其他东西?
有人可以向我解释一下,甚至提供一个小例子,其中有人在 java 或 php 中 XOR 的字符串?
通常,当向用户显示哈希的输出时,会显示编码为十六进制字符串,有时您可能还会看到Base64字符串,但这种情况比较少见。
MD5 哈希的输出是一个 16 字节(128 位)的值。单个字节可以具有的全部值可以显示为两位十六进制值。这个十六进制值的范围可以从 00 到 FF,十进制是 0 到 255,或者更清楚地是二进制 00000000 到 11111111(一个字节中的八位)。
所以16个字节可以表示为32个16进制数字而不会丢失任何信息,并且具有便于目视比较的优点。
编辑:
另一个混淆的来源可能是您的前提是散列适用于字母数字数据,这是不正确的。诸如 MD5 之类的哈希不会对字符串进行操作,而是对任意数据进行操作。
当您对字符串进行哈希处理时,它会使用 UTF-8 等编码作为数据进行哈希处理。例如,hello
UTF-8 中的表示是01101000 01100101 01101100 01101100 01101111
二进制或68 65 6C 6C 6F
十六进制。该数字是哈希的实际输入。
它们是字母数字的,因为结果以十六进制形式显示。使可视化和比较变得更容易。