1

我在 C# 中有一个哈希方法,如下所示:

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

byte[] raw_input  = Encoding.UTF32.GetBytes("hello");
byte[] raw_output = md5.ComputeHash(raw_input);

string output = "";
foreach (byte myByte in raw_output)
    output += myByte.ToString("X2");

return output;

如何在 PHP 中实现它?执行以下操作会产生不同的哈希摘要...

$output = hash('md5', 'hello');
4

3 回答 3

5

您需要找出 PHP 使用哪种编码将您的字符串转换为文本。它不太可能使用 UTF-32。它很可能使用平台默认编码,或者可能是 UTF-8。

using (MD5 md5 = MD5.Create())
{
    byte[] input = Encoding.UTF8.GetBytes("hello");
    byte[] hash = md5.ComputeHash(input);
    return BitConverter.ToString(hash).Replace("-", "");
}

(这是将字符串视为二进制数据的语言/平台的问题 - 它并不清楚发生了什么。这里必须转换为字节,因为 MD5 是为字节定义的,而不是 Unicode字符。在 C# 代码中,您正在显式执行此操作……在 PHP 中,它是隐式的且文档记录不充分。)

编辑:如果你必须改变 PHP,你可以试试这个:

$text = mb_convert_encoding($text, "UTF-32LE");
$output = md5($text)

这取决于PHP是否支持UTF-32...

于 2012-07-24T19:40:45.453 回答
5

PHP

此 PHP 代码将执行以下操作:

<?php
$str = "admin";
$strUtf32 = mb_convert_encoding($str, "UTF-32LE");
echo md5($strUtf32);
?>

此代码输出“1e3fcd02b1547f847cb7fc3add4484a5”

于 2012-07-24T19:41:47.483 回答
1

当您申请md5Encoding.UTF32.GetBytes("admin");,与

echo hash( "md5","a\0\0\0d\0\0\0m\0\0\0i\0\0\0n\0\0\0");
//1e3fcd02b1547f847cb7fc3add4484a5

在 php.ini 中。

您需要在 PHP 中将字符串转换为 UTF32-LE:

echo md5( mb_convert_encoding( "admin", "UTF-32LE" ) );
//1e3fcd02b1547f847cb7fc3add4484a5
于 2012-07-24T19:53:41.280 回答