我费了好大劲才弄明白这一点。例如,MD5 或 SHA1 如何对字符串进行哈希处理并仅返回字母数字字符。我的意思是,如果我没有完全放弃,他们都或至少 MD5 将字符串转换为二进制,然后附加任何丢失的内容,以便能够将其分成 512 个字符的 block 。然后它进行一系列操作,其中之一是对每个 block 的 32 个单词中的一个进行 XOR。我的意思是,最后只得到字母数字字符不可能是纯粹的运气,XOR 必须产生其他东西吗?
有人可以向我解释一下,甚至可以提供一个小例子,说明某人对 java 或 php 中的字符串进行异或吗?
最佳答案
通常在向用户显示时,散列的输出显示编码为 hexadecimal字符串,有时您可能还会看到 Base64字符串,但这种情况更为罕见。
MD5 散列的输出是一个 16 字节(128 位)的值。单个字节可以具有的全部值范围可以显示为两位十六进制值。这个十六进制值的范围可以从 00 到 FF,十进制是 0 到 255 或者更清楚的是二进制 00000000 到 11111111(一个字节中的八位)。
所以16个字节可以表示为32个十六进制数字,不会丢失任何信息,而且具有便于目测比较的优点。
编辑:
混淆的另一个来源可能是您假设哈希对字母数字数据起作用,这是不正确的。诸如 MD5 之类的哈希不对字符串进行操作,它们对任意数据进行操作。
当您对字符串进行哈希处理时,它会使用 UTF-8 等编码作为数据进行哈希处理。例如,hello
在 UTF-8 中的表示形式是 01101000 01100101 01101100 01101100 01101111
二进制形式或 68 65 6C 6C 6F
十六进制形式。该数字是散列的实际输入。
关于php - 总是返回字母数字字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743953/