2012-10-25 77 views
0

我在.Net C#中有這個功能,並且想在PHP中做同樣的事情。但我不明白所有的C#部分和不知道我的代碼。.Net C#to PHP Pb byte [] array&ComputeHash

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

,發現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. 返回字符串。

我錯了嗎?如果是(當然)你能解釋我嗎?

那麼它給我: 「回聲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 
) 

回聲$ 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

你認爲這是正確的?謝謝您的幫助。

回答

1
  • PHP的「字節數組」是字符串,沒有必要用實際陣列
  • ,如果你的字符串在UTF-8已編碼,就沒有必要相當於Encoding.UTF8.GetBytes(input)線;如果不是,用它轉換iconv
  • PHP的md5已經返回一個十六進制字符串,沒有必要建立一個從原料輸出

總之,相當於C#功能PHP大概是:

echo md5($input); 

話雖如此,可能有關於C#的錯綜複雜,在這裏可能會改變結果。