2011-01-30 10 views
0

ここでは、文字列からハッシュ値を取得する小さなヘルパーメソッドです。なぜ私はハッシュ値の代わりに不器用になってしまいますか?

public static string GetHashValue(string sourceString) 
     { 
      MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); 
      return Encoding.UTF8.GetString(provider.ComputeHash(Encoding.UTF8.GetBytes(sourceString))); 
     } 

私は、この関数から取得した値が実際のハッシュ値であるとは思わない。しかし、私の代わりに、ハッシュ値の奇妙なテキストのいくつかの並べ替えを取得しています。事前に

感謝:)

+1

出力として印刷するとどうなりますか? A〜Fの文字と0〜9の数字だけを含むものがあれば、それはハッシュ値です。 – BoltClock

+0

ハッシュがバイト単位で、文字列表現に変換しようとしていますか? –

+0

@Kイワノフ: - はい! – TCM

答えて

1

あなたは、これは16進数の文字列として表示されることを期待することができます。これは一般的な表現であり、現在表示しているものとは異なります。詳細は、the MSDN sampleを参照してください。

(上記のサンプルから適応)あなたのコードを以下のように変更してみてください。ここでは意味がありませんUTF8.GetString()を使用

public static string GetHashValue(string sourceString) 
{ 
    MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider() 
    byte[] hashData = provider.ComputeHash(Encoding.UTF8.GetBytes(sourceString)); 

    int i; 
    StringBuilder sOutput = new StringBuilder(hashData.Length); 
    for (i=0; i < hashData.Length; ++i) 
    { 
     sOutput.Append(hashData[i].ToString("X2")); 
    } 
    return sOutput.ToString(); 
} 
+0

- 急いで私は増分するのを忘れてしまった。あなたのループを見てください。しかし、それは大丈夫です! – TCM

2

を、ハッシュ関数がでエンコードされた文字列を返しません。 utf-8。任意のバイト値を持つバイト[]のみです。代わりにConvert.ToBase64String()を使用してください。それはまだぞっとするようですが、それはそうなっています。それはハッシュです。 Convert.FromBase64String()でbyte []に​​ラウンドトリップできます。

関連する問題