Я перехожу с nodejs на PHP и не могу получить аналогичный выходной хэш-дайджест md5 для приведенного ниже фрагмента с тем же вводом. Возможно, что-то мне не хватает.
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, с учетом ваших предложений, но они не работают:
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
). Как я уже говорил, пожалуйста, помогите мне найти PHP-ЭКВИВАЛЕНТ версию первого фрагмента кода nodejs.
Вы не должны использовать: new Buffer(str, 'binary')
просто:
const md5 = crypto
.createHash('md5')
.update(string)
.digest('hex');
Используя это, вы получите тот же результат с php md5
Linux md5sum
и узел.
Для вашего ввода: 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, вот он:
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
так же, как ваш фрагмент узла.
Других решений пока нет …