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 的 SoF 帖子:String to byte array in php

所以在这里我所做的只是为了进行一些测试:

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. 然后创建一个数组 'byte[]' 'array' ,其中包含以字节表示的 'input' 。
  3. 然后在 md5 中编码“数组”。
  4. 创建一个新字符串。
  5. 然后创建一个包含 'array' 的数组 'byte[]' 'array2'
  6. 然后将字符串附加到小写字节的字符串表示中。
  7. 返回字符串。

我错了吗 ?如果是(当然)你能解释一下吗?

那么它给了我什么:“echo getMD5Hash('1ca48ad63d48c3adfae0d7af77f27027');”

打印_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
)

回声 $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
)

回声给我:3333333333333633333333363633333333333636363333333333333333333636

你认为这是正确的吗?谢谢您的帮助。

4

1 回答 1

1
  • PHP的“字节数组”是字符串,不需要使用实际的数组
  • 如果您的字符串已经以 UTF-8 编码,则没有必要等效于该Encoding.UTF8.GetBytes(input)行;如果不是,请使用iconv
  • PHPmd5已经返回一个十六进制字符串,无需从原始输出构建一个

总而言之,与该 C# 函数等效的 PHP 可能是:

echo md5($input);

话虽如此,C# 可能有一些错综复杂的地方让我无法理解,这可能会改变结果。

于 2012-10-25T08:59:02.383 回答