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で。

PHPで文字列をUTF32-LEに変換する必要があります。

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