私はこのビットのt-sqlコードを持っています
set @UrlHash = convert(bigint, hashbytes('MD5', @Url))
SQLに移動せずに、上記の行とまったく同じハッシュを返す関数をC#で記述できるかどうか疑問に思います。
出来ますか?
要件は、C#がまったく同じハッシュを作成する必要があることです。
選択
SELECT CONVERT(BIGINT, HASHBYTES('MD5', 'http://stackoverflow.com'))
次の結果が得られます。
-3354682182756996262
C#でMD5ハッシュを作成しようとした場合
MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash);
long numeric = BitConverter.ToInt64(result, 0);
numeric
になります8957512937738269783
。
では、問題は何ですか(MD5ハッシュが128ビットでBIGINT
/long
が64ビットであるという事実を除いて)?
これはエンディアンの問題です(バイトの順序が間違っています)。BitConverter
クラスを使用して修正し、必要に応じてバイトを反転させましょう。
MD5 md5 = MD5.Create();
byte[] textToHash = Encoding.UTF8.GetBytes("http://stackoverflow.com");
byte[] result = md5.ComputeHash(textToHash);
if (BitConverter.IsLittleEndian)
Array.Reverse(result);
long numeric = BitConverter.ToInt64(result, 0);
numeric
今-3354682182756996262
あなたが望むようになっています。
MD5 クラスを使用する必要があります。http://blogs.msdn.com/b/csharpfaq/archive/2006/10/09/how-do-i-calculate-a-md5-hash-from-aの例を次に示します。 -string_3f00_.aspx、出力は int 64 :
public int64 CalculateMD5Hash(string input)
{
// step 1, calculate MD5 hash from input
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
return BitConverter.ToInt64(hash, 0);
}
MD5 ハッシュ標準ではありませんか? 標準の MD5 C# 実装を使用できませんか? ここでコードを使用するのはどうですか?