.Net C#到PHP Pb with byte array&ComputeHash

我在.Net C#中有这个function,并希望在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

并找到了关于字符串到字节的SoFpost: 字符串到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中编码’array’。
  4. 创建一个新字符串。
  5. 然后创建一个包含’array’的数组’byte []”array2′
  6. 然后使用小写的字符串表示forms追加String。
  7. 返回String。

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

所以它给了我:“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 ) 

回声给我:3333333333333633333333363333333333333636363333333333333333333636

你觉得这是对的吗? 谢谢您的帮助。

  • PHP的“字节数组”是字符串,不需要使用实际的数组
  • 如果你的字符串已经用UTF-8编码,则没有必要等同于Encoding.UTF8.GetBytes(input)行; 如果不是,请使用iconv转换
  • PHP的md5已经返回一个hex字符串,无需从原始输出构建一个

总而言之,与C#函数相当的PHP可能是:

 echo md5($input); 

话虽如此,可能有一些关于C#的错综复杂的内容让我无法改变结果。