【问题标题】:Is there a reason php's (and python's) hash function is different to my system's? [duplicate]php(和python)的散列函数与我的系统不同有什么原因吗? [复制]
【发布时间】:2012-03-03 10:43:09
【问题描述】:

可能重复:
Why is an MD5 hash created by Python different from one created using echo and md5sum in the shell?

我刚看到这个,我不明白。难道我不知道一些关于 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-8,这些都是ascii-range字符。我不知道我忽略了什么。

有趣的是,对于某些“有趣”的价值,Python 与 PHP 一致:

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

老实说,尽管我开口谦虚,但我认为这是某种巨大且未知的 PHP 错误。但我猜不是。

【问题讨论】:

  • 确实是重复的,这是因为尾随换行。
  • 是的。它没有出现,因为当我搜索时,我正在寻找 PHP 问题,并且我没有使用该帖子的其他特定术语。我的更笼统:那个是 mine 的骗子。

标签: php python linux hash


【解决方案1】:

echo 还在参数之后输出一个换行符。使用-n 选项取消换行:

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

【讨论】:

    【解决方案2】:
    $ php -a
    Interactive shell
    
    php > echo hash('sha512', "hello\n");
    e7c22b994c59d9cf2b48e549b1e24666636045930d3da7c1acb299d1c3b7f931f94aae41edda2c2b207a36e10f8bcb8d45223e54878f5b316e7ce3b6bc019629
    

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

    【讨论】:

      【解决方案3】:

      一切都很简单。 echo 在末尾添加一个换行符。

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

      【讨论】:

        【解决方案4】:

        Echo 在其参数中添加了一个换行符,因此您实际上是在散列字符串“hello\n”。当我使用上面的示例代码在 python 或 php 中尝试这个字符串时,我得到了 e7c22... 哈希。或者

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

        【讨论】:

          猜你喜欢
          • 2015-08-10
          • 2010-12-04
          • 2019-12-31
          • 2016-01-09
          • 1970-01-01
          • 2013-12-03
          • 2013-11-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多