Вы не должны использовать: new Buffer(str, 'binary')
просто:
const md5 = crypto
.createHash('md5')
.update(string)
.digest('hex');
Используя это, вы получите тот же вывод с php md5
, linux md5sum
и node.
Для вашего ввода: 42b86318d761e13ef90c126c3e060582¤3¤724039¤1
следующие команды будут печатать одинаково:
md5sum
echo -n "42b86318d761e13ef90c126c3e060582¤3¤724039¤1" | md5sum
PHP
echo md5("42b86318d761e13ef90c126c3e060582¤3¤724039¤1");
Узел
require('crypto')
.createHash('md5')
.update("42b86318d761e13ef90c126c3e060582¤3¤724039¤1")
.digest('hex');
Все три будут выводить: b8ee918f782fe7135b25c1fa59339094
ПРИМЕЧАНИЕ:
new Buffer
устарело, вместо этого следует использовать Buffer.from
.
Другие сайты, такие как https://www.katacoda.com/courses/nodejs/playground,https://repl.it/, https://www.jdoodle.com/execute-nodejs-online поддерживают мою заявку (т. Е. Дайджест md5 равен 9860bd2248c069c7b65045917c215596)
Они не поддерживают вашу заявку , вы выполняете один и тот же код, что неверно, во многих различных средах node.js.Конечно, каждая среда Node.js будет печатать этот вывод для вашего кода, что не делает его правильным.
Поскольку вы не можете изменить код и хотите получить эквивалент PHP, вот оноis:
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
То же, что и ваш фрагмент узла.