1

私はこのビットのt-sqlコードを持っています

set @UrlHash = convert(bigint, hashbytes('MD5', @Url))  

SQLに移動せずに、上記の行とまったく同じハッシュを返す関数をC#で記述できるかどうか疑問に思います。

出来ますか?

要件は、C#がまったく同じハッシュを作成する必要があることです。

4

3 に答える 3

7

選択

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あなたが望むようになっています。

于 2013-02-27T08:38:11.330 に答える
0

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);
}
于 2013-02-26T13:50:52.177 に答える
-1

MD5 ハッシュ標準ではありませんか? 標準の MD5 C# 実装を使用できませんか? ここでコードを使用するのはどうですか?

于 2013-02-26T13:50:29.857 に答える