【发布时间】:2021-12-23 01:17:38
【问题描述】:
我正在使用 hashlib sha256 (python) 来证明两个输入。
我的假设是空字符,空字符串会给出相同的哈希值。
这是我的代码
from hashlib import sha256
print(sha256(b'\x00').hexdigest(),end='\n\n')
print(sha256(b'').hexdigest())
它给出了输出
6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
为什么他们没有给出相同的结果?
字符串总是以null结尾的C语言字符串格式有关系吗? 所以当我散列null时,它会散列双null?
【问题讨论】:
-
你的假设是错误的。空字符串的长度为 0。零字节的长度为 1。在 SHA 中填充和添加长度可防止它创建相同的结果。它与C字符串无关,因为你这里有二进制数据。
-
I call it my billion-dollar mistake, Tony Hoare。您混淆了空字符串和空字符串。 Null 表示指针的地址为 0,空字符串表示字符串中没有任何内容 - 长度为 0。 NIST 甚至发布了零长度示例代码in test vectors
-
@kelalaka 一个包含一个值为零的单个字节的 Python 字符串与地址为 0 的指针无关。它只是编码一个长度为 1 的字节数组,其中包含一个零字节。
-
@Morrolan 好吧,我主要讨论的是常见的误解。这就是重点,为什么值为 0 的字符串应该为空!
标签: hash