空字符串哈希和空字符哈希不一样?

Muh*_*ira 6 hash

我使用 hashlib sha256 (python) 来证明两个输入。

我的假设是空字符和空字符串将给出相同的哈希值。

这是我的代码

from hashlib import sha256
print(sha256(b'\x00').hexdigest(),end='\n\n')
print(sha256(b'').hexdigest())
Run Code Online (Sandbox Code Playgroud)

它给出了输出

6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Run Code Online (Sandbox Code Playgroud)

为什么他们没有给出相同的结果?

与C语言字符串格式总是以null结尾有关系吗?那么当我散列 null 时,它会散列 double null 吗?

小智 4

空字符串是(或者严格来说,“编码为”)长度为零的字节数组,不包含任何字节。您可以使用 Python 观察这一点,如下所示:

>>> list(bytes("", 'ascii'))
[]
Run Code Online (Sandbox Code Playgroud)

另一方面,由单个零字节组成的字符串是长度为 1 的字节数组,包含值为零的单个字节:

>>> list(bytes("\x00", 'ascii'))
[0]
Run Code Online (Sandbox Code Playgroud)

因此,这两个输入是不同的,并且将散列为不同的值。

正如上面的评论中提到的,与某些语言(例如 C)如何表示字符串无关,使用零字节来指示它们的结尾。