我在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');
答案 0 :(得分: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但是......
答案 1 :(得分:4)
<强> PHP 强>
这个PHP代码将执行:
<?php
$str = "admin";
$strUtf32 = mb_convert_encoding($str, "UTF-32LE");
echo md5($strUtf32);
?>
此代码输出“1e3fcd02b1547f847cb7fc3add4484a5”
答案 2 :(得分:1)
将md5
应用于Encoding.UTF32.GetBytes("admin");
时,与
echo hash( "md5","a\0\0\0d\0\0\0m\0\0\0i\0\0\0n\0\0\0");
//1e3fcd02b1547f847cb7fc3add4484a5
在php。
您需要在PHP中将字符串转换为UTF32-LE:
echo md5( mb_convert_encoding( "admin", "UTF-32LE" ) );
//1e3fcd02b1547f847cb7fc3add4484a5