擅长:python、mysql、java
<p><code>sha256sum</code>和相关命令正在输出中添加破折号:<code>-</code>。这些命令用于显示*文件的哈希值。单破折号表示输入来自标准inpuIt流(即没有文件名)。不幸的是,我看不到抑制输出的选项,所以您必须自己删除它才能得到实际的散列值。</p>
<p>因此哈希实用程序不仅返回哈希值。SHA-256哈希值仅由32个字节组成。由于人类无法读取二进制文件,二进制文件使用十六进制显示,但实际值仍应视为字节。十六进制字符只是这些字节的<em>表示</em>。</p>
<p>哈希函数的输入也由位或字节组成。这意味着编码文本的任何差异都意味着散列值将不同。当涉及到空白和行尾编码时,这尤其棘手。不过,在“hello”的情况下,最好使用<code>echo</code>命令的<code>-n</code>命令行选项来抑制它,而不是添加后面的换行符。</p>
<p>因此,请尝试以下操作:</p>
<pre><code>echo -n "hello" | sha256sum | tr -d "[:space:]-"
</code></pre>
<p>或者,使用OpenSSL(它有类似的问题):</p>
<pre><code>echo -n hello | openssl sha256 -binary | od -An -tx1 | tr -d "[:space:]"
</code></pre>
<p>这还将删除后面的换行符,以便您可以进行十六进制比较。</p>
<hr/>
<p>对于Java,还应该确保文本编码与系统默认编码匹配,否则可能会遇到麻烦。所以你应该改变:</p>
<pre><code>md.update(text.getBytes("UTF-8"));
</code></pre>
<p>到</p>
<pre><code>md.update(text.getBytes());
</code></pre>
<p>以获取平台字符编码。如果不这样做,则如果要比较的字符串的平台编码与UTF-8不兼容,则比较将失败。</p>
<hr/>
<p>在没有行尾的Python中,要完成这个答案:</p>
<pre><code>print(hashlib.sha256("hello").hexdigest(), end="")
</code></pre>
<hr/>
<p>请注意,十六进制本身也可以以不同的方式显示;您将确保不存在空白,并且比较不区分大小写,或者字节的<em>表示</em>始终使用相同的大小写。</p>