2011-10-18 21 views
0

にC#ラインを変換しますは、私はC#で、以下の機能を持っているPHP

static MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider(); 

    public string Guid GetMD5(string str) 
    { 
     lock (md5Provider) 
     { 
      return (new Guid(md5Provider.ComputeHash(Encoding.Unicode.GetBytes(str)))).ToString(); 
     } 
    } 

私は同じコードを必要とするが、PHPで。 md5()関数の動作は異なります。私はあなたがGUIDをハッシュに変換され、そしてGUID.ToString()はどのようなM $コール「レジストリに文字列を返すので、あなたが持っている問題は、C#のコードは、ダッシュで区切られたハッシュを返すことである疑いがある

THX

+5

MD5機能はどこでも同じ動作をします。出力が異なる場合は、入力が異なります。例えば1つの場所でutf-8を実行していますが、別の場所ではiso-8859を実行しています。md5は文字ではなく生のバイトで動作します。 –

+4

'Encoding.Unicode.GetBytes(str)'は、UTF-16LEエンコーディングを使って 'str'を表すバイトを返します。 – dtb

+0

ご回答いただきありがとうございます。おそらくエンコードの問題です。私はまだPHPでこの関数を再現できません。 – user1001518

答えて

4

GUIDの標準の8-4-4-4-12文字列表記である "format"を使用します。この場合は

は、あなたがこの機能で同じ結果を得ることができます:

function md5_guid ($data, isFile = FALSE) { 
    if ($isFile) { 
    if (is_file($data) && is_readable($data)) { 
     $hash = str_split(md5_file($data), 4); 
    } else { 
     return FALSE; 
    } 
    } else { 
    $hash = str_split(md5($data), 4); 
    } 
    return "$hash[0]$hash[1]-$hash[2]-$hash[3]-$hash[4]-$hash[5]$hash[6]$hash[7]"; 
} 


// Returns the MD5 hash of the string 'this is some data' in the format of a GUID 
echo md5_guid('this is some data'); 

// Returns the MD5 hash of the file at 'somefile.txt' in the format of a GUID 
echo md5_guid('somefile.txt', TRUE); 
+2

これは正しいです。 GuidクラスのtoString()メソッドのデフォルト値は、ダッシュを追加することです。 C#コードでこの動作を変更するには、formatパラメータをtoStringメソッドに渡します。[docs](http://msdn.microsoft.com/en-us/library/97af8hh4.aspx) –

+0

@ Jan-Henk ...またはあなたはGUIDビットを気にする必要はありませんし、 'MD5CryptoServiceProvider'から直接文字列を取得することができます... – DaveRandom

+0

本当に、私は何を考えていましたか? –

関連する問題