关于node.js:以下nodejs md5哈希源代码的等效php版本是什么?

what would the equivalent php version be of the following nodejs md5 hashing source code?

我正在从nodejs迁移到PHP,但对于以下具有相同输入的代码片段,我无法获得类似的输出md5哈希摘要。也许我缺少一些东西。

1
2
3
var md5sum = crypto.createHash('md5');
md5sum.update(new Buffer(str, 'binary'));
md5_result = md5sum.digest('hex');

预先感谢您的帮助!,顺便说一句,我的nodejs版本是10.1.0,npm版本是5.6.0。对于那些询问的人,此源代码等效项不是md5($str),它也不是我的代码,我只是在对其进行转换。例如,对于以下输入42b86318d761e13ef90c126c3e060582¤3¤724039¤1,获得的摘要为9860bd2248c069c7b65045917c215596

考虑到您的提案,我只是尝试在https://www.tutorialspoint.com/execute_nodejs_online.php上运行以下代码段,但它们不起作用:

1
2
3
4
5
6
7
8
9
10
const crypto = require('crypto');
var str ="42b86318d761e13ef90c126c3e060582¤3¤724039¤1";
var md5sum = crypto.createHash('md5');
md5sum.update(new Buffer(str, 'binary'));
const md5_result = md5sum.digest('hex');
const md5 = crypto.createHash('md5').update(str).digest('hex');
const expected_digest ="9860bd2248c069c7b65045917c215596";
console.log("original version digest:" + md5_result);
console.log("proposed equivalent digest:" + md5);
console.log("expected digest:" + expected_digest);

我在该站点上得到的是:
original version digest:9860bd2248c069c7b65045917c215596
proposed equivalent digest:b8ee918f782fe7135b25c1fa59339094
expected digest:9860bd2248c069c7b65045917c215596

https://www.katacoda.com/courses/nodejs/playground、https://repl.it/,https://www.jdoodle.com/execute-nodejs-online等其他网站都支持我的主张(即md5摘要为9860bd2248c069c7b65045917c215596),但是,到目前为止,此站点http://rextester.com/l/nodejs_online_compiler输出您从其中获得的一些信息(即b8ee918f782fe7135b25c1fa59339094)。正如我之前所说,请帮助我找到第一个nodejs代码片段的PHP等效版本。


您不应该使用:new Buffer(str, 'binary')只是:

1
2
3
4
const md5 = crypto
    .createHash('md5')
    .update(string)
    .digest('hex');

使用它,您将得到与php md5,linux md5sum和node相同的输出。

对于您的输入:42b86318d761e13ef90c126c3e060582¤3¤724039¤1,以下命令将打印相同的内容:

md5sum

1
echo -n"42b86318d761e13ef90c126c3e060582¤3¤724039¤1" | md5sum

的PHP

1
echo md5("42b86318d761e13ef90c126c3e060582¤3¤724039¤1");

节点

1
2
3
4
require('crypto')
        .createHash('md5')
        .update("42b86318d761e13ef90c126c3e060582¤3¤724039¤1")
        .digest('hex');

所有这三个将输出:b8ee918f782fe7135b25c1fa59339094

注意:

不建议使用new Buffer,而应使用Buffer.from

Other sites such as
https://www.katacoda.com/courses/nodejs/playground,https://repl.it/
,https://www.jdoodle.com/execute-nodejs-online support my claim (i.e.
md5 digest is 9860bd2248c069c7b65045917c215596)

他们不支持您的主张,而是在许多不同的node.js环境上执行相同的代码,这是错误的。 当然,每个Node.js环境都会为您的代码打印该输出,但这并不正确。

由于您无法修改代码,并且需要与PHP等效的代码,因此它是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function utf8_char_code_at($str, $index) {
    $char = mb_substr($str, $index, 1, 'UTF-8');

    if (mb_check_encoding($char, 'UTF-8')) {
        $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');
        return hexdec(bin2hex($ret));
    } else {
        return null;
    }
}

function myMD5($str) {

     $tmp ="";

     for($i = 0; $i < mb_strlen($str); $i++)
        $tmp .= bin2hex(chr(utf8_char_code_at($str, $i)));

     return md5(hex2bin($tmp));
}

echo myMD5($string);

utf8_char_code_at摘自:https://stackoverflow.com/a/18499265/1119863

它将输出:9860bd2248c069c7b65045917c215596与您的节点代码段相同。