是否有一个原因PHP的(和Python的)哈希函数是不同的我的系统?

可能重复:
为什么Python创build的MD5散列与使用shell中的echo和md5sum创build的散列不同?

我刚看到这个,我不明白。 我不知道有关PHP的内部…什么东西? 还是有假设我正在做…什么? 那不正确?

$ sha512sum <(echo 'hello') e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629 /proc/self/fd/11 

并且:

 $ echo 'hello' | sha512sum e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629 - 

但是之后:

 php -a Interactive shell php > echo hash('sha512', 'hello'); 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 ∅ cat hashtest.php <?php echo hash('sha512', 'hello'); ?> ∅ php hashtest.php 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 

这是怎么回事? 我在Linux x86_64,我的系统文本编码是UTF utf-8 ,这些都是ASCII字符。 我不知道我在忽略什么。

有趣的是 ,对于一些“有趣的”值,Python同意PHP:

 >>> hashlib.sha512(b'hello').hexdigest() '9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043' 

老实说,尽pipe我谦虚的开放,我认为这是一种巨大的和未知的PHP错误。 但我猜不。

 $ php -a Interactive shell php > echo hash('sha512', "hello\n"); e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629 

标准的echo命令包含一个尾随的换行符。 尝试echo -n获得相同的结果。

echo也在参数之后输出一个换行符。 使用-n选项禁止换行符:

 $echo -n 'hello' | sha512sum 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 - 

一切都很简单。 echo在最后添加一个换行符。

 $ php -r 'echo hash(sha512, "hello\n");' e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629 

Echo为它的参数添加了一个换行符,所以你实际上是对字符串“hello \ n”进行哈希处理。 当我用上面的示例代码在python或php中尝试这个字符串时,我得到了e7c22 … hash。 要么

 $ echo -n 'hello' | sha512sum 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 -