【问题标题】:Always return alphanumeric characters?总是返回字母数字字符?
【发布时间】:2013-09-15 15:22:48
【问题描述】:

我很难理解这一点。例如,MD5 或 SHA1 如何对字符串进行散列并且只返回字母数字字符。我的意思是,如果我没有完全关闭,他们都或至少 MD5 将字符串转换为二进制,然后附加任何丢失的内容以便能够将其分割成 512 个字符的块。然后它执行一系列操作,其中一个是对每个块的 32 个单词中的一个进行 XOR。我的意思是,最后只得到字母数字字符不可能是纯粹的运气,XOR 必须产生其他东西?

有人可以向我解释一下,甚至提供一个小例子,说明有人在 java 或 php 中对字符串进行异或运算吗?

【问题讨论】:

  • 希望我没有误会,但是 md5 总是返回 16 个字节 - 可以扩展为以十六进制表示的 32 个长度的字符串。
  • 他们没有。你通常看到的是用十六进制(有时是base64)编码的二进制结果。
  • 无论整数有多大,您都可以用十进制表示法只使用数字 0-9,或以二进制形式仅使用 0 和 1,或以十六进制形式使用 0-9 和 a -f.

标签: php javascript hash md5 sha


【解决方案1】:

通常,当向用户显示哈希的输出时,会显示编码为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。该数字是哈希的实际输入。

【讨论】:

  • 好的,但是,如果输出以十六进制显示。然后从我在 wiki 上读到的内容来看,该算法是如何生成的,所以无论它得到什么二进制的东西,总是变成字母数字的?
  • @user1768788 我更新了我的答案以澄清。为了直接回答您,散列适用于任意数据,不一定是字母数字。
  • 我的问题可能不清楚,让我演示一下:你有你想要散列的字符串,例如,一个问号 (?),二进制,即:00111111 现在使用 MD5 他们有不同的值来运行不同的操作,假设你的值是“b”(01100010)并且你正在做 XOR:00111111 01100010 -------- 01011101 这个新的二进制值等于],我不'不明白它怎么不能在某个地方得到这样的结果。我不能让这个文本有空格,所以在这里寻找澄清:HERE
  • @user1768788 该数字不是也不应该被解码为字符数据。大多数程序只会显示数字的十六进制值。
  • @user1768788 - 正如 Dev 已经提到的,单个字节可以表示 256 个值。使用字符 0-9 和 A-F,您可以表示 16 个值。使用两个相同的字符可以表示 16*16 的值,这与单个字节可以 (256) 相同。因此,您可以遍历 MD5 哈希的每个字节并用 2 个这样的字符表示它,这就是十六进制表示,一种编码。
【解决方案2】:

它们是字母数字的,因为结果以十六进制形式显示。更容易进行可视化和比较。

【讨论】:

  • 我还是不明白,确定可以是十六进制的,但是十六进制可以显示的不仅仅是字母数字字符吗?如果我没有完全错,!十六进制是 21?
  • 不,十六进制表示严格使用字符 0-9 和 a-f。任何二进制值,包括由哈希产生的值,都可以以十六进制形式显示。
猜你喜欢
  • 2019-01-19
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多