我使用 hashlib sha256 (python) 来证明两个输入。
我的假设是空字符和空字符串将给出相同的哈希值。
这是我的代码。
from hashlib import sha256
print(sha256(b'\x00').hexdigest(),end='\n\n')
print(sha256(b'').hexdigest())
它给出了输出。
6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
为什么他们没有给出相同的结果?
与C语言字符串格式总是以null结尾有关系吗? 那么当我散列 null 时,它会散列 double null 吗?
空字符串是(或者严格来说,“编码为”)长度为零的字节数组,不包含任何字节。您可以观察这一点,例如如下,使用Python:
>>> list(bytes("", 'ascii'))
[]
另一方面,由单个零字节组成的字符串是长度为 1 的字节数组,包含值为零的单个字节:
>>> list(bytes("\x00", 'ascii'))
[0]
因此,这两个输入是不同的,并且将散列为不同的值。
正如上面评论中提到的,与某些语言(例如 C)如何表示字符串无关,使用零字节来指示它们的结尾。