0

私は.Net C#でこの関数を持っていて、PHPで同じことをしたい. しかし、私はすべての C# の部分を理解しているわけではなく、自分のコードについて確信が持てません。

public static string getMD5Hash(string input)
{
    MD5 mD = new MD5CryptoServiceProvider();
    byte[] array = Encoding.UTF8.GetBytes(input);
    array = mD.ComputeHash(array);
    StringBuilder stringBuilder = new StringBuilder();
    int i = 0;
    byte[] array2 = array;
    int length = array2.Length;
    while (i < length)
    {
        stringBuilder.Append(array2[i].ToString("x2").ToLower());
        i++;
    }
    return stringBuilder.ToString();
}

ここで、文字列からMD5ハッシュを作成する方法を説明する例を見つけました(同じ人です): http://en.csharp-online.net/Create_a_MD5_Hash_from_a_string

そして、String to Byte : String to byte array in phpに関する SoF の投稿を見つけました

だからここで私がやったのは、いくつかのテストを行うためだけです:

function getMD5Hash($input){


for($i = 0; $i < strlen($input); $i++){

    $char = substr($input,$i,1);
    $hex_ary[] = sprintf("%02X", ord($char));}


$TheMD5=md5(implode('',$hex_ary));

for($i = 0; $i < strlen($TheMD5); $i++){

    $char = substr($TheMD5,$i,1);
    $Sec_hex_ary[] .= sprintf("%02X", ord($char));}


$StringBuilder ='';
$i = 0;
$Thelength = count($Sec_hex_ary);

while ($i < $Thelength)
{
    $stringBuilder .= strtolower(sprintf("%02X", ord($Sec_hex_ary[$i])));
    $i++;
}

return $stringBuilder;}

だから私が理解していること(うまくいくことを願っています):

  1. 最初に md5 プロバイダーを呼び出します。PHP => 不要
  2. 次に、バイト表現で「input」を含む配列「byte[]」「array」を作成します。
  3. 次に、「配列」を md5 でエンコードします。
  4. 新しい文字列を作成します。
  5. 次に、「array」を含む配列「byte[]」「array2」を作成します
  6. 次に、バイトの文字列表現を小文字で文字列に追加します。
  7. 文字列を返します。

私が間違っている ?はいの場合 (確かに) 説明していただけますか?

それが私に与えるもの: "echo getMD5Hash('1ca48ad63d48c3adfae0d7af77f27027'); "

Print_r($hex_ary) =

Array
(
    [0] => 31
    [1] => 63
    [2] => 61
    [3] => 34
    [4] => 38
    [5] => 61
    [6] => 64
    [7] => 36
    [8] => 33
    [9] => 64
    [10] => 34
    [11] => 38
    [12] => 63
    [13] => 33
    [14] => 61
    [15] => 64
    [16] => 66
    [17] => 61
    [18] => 65
    [19] => 30
    [20] => 64
    [21] => 37
    [22] => 61
    [23] => 66
    [24] => 37
    [25] => 37
    [26] => 66
    [27] => 32
    [28] => 37
    [29] => 30
    [30] => 32
    [31] => 37
)

echo $TheMD5;

=> 418868f1137ea82935bbd235133993cf

print_r($Sec_hex_ary);

Array
(
    [0] => 34
    [1] => 31
    [2] => 38
    [3] => 38
    [4] => 36
    [5] => 38
    [6] => 66
    [7] => 31
    [8] => 31
    [9] => 33
    [10] => 37
    [11] => 65
    [12] => 61
    [13] => 38
    [14] => 32
    [15] => 39
    [16] => 33
    [17] => 35
    [18] => 62
    [19] => 62
    [20] => 64
    [21] => 32
    [22] => 33
    [23] => 35
    [24] => 31
    [25] => 33
    [26] => 33
    [27] => 39
    [28] => 39
    [29] => 33
    [30] => 63
    [31] => 66
)

そして、エコーは私に与えます:

これは正しいと思いますか?助けてくれてありがとう。

4

1 に答える 1

1
  • PHP の「バイト配列」は文字列であるため、実際の配列を使用する必要はありません
  • Encoding.UTF8.GetBytes(input)文字列がすでに UTF-8 でエンコードされている場合、その行に相当する必要はありません。そうでない場合は、次を使用して変換しますiconv
  • PHPmd5はすでに 16 進文字列を返します。生の出力から作成する必要はありません。

全体として、その C# 関数に相当する PHP はおそらく次のようになります。

echo md5($input);

そうは言っても、結果を変える可能性のある、ここで私を逃れるC#に関する複雑さがあるかもしれません。

于 2012-10-25T08:59:02.383 に答える