2

SHA1T-SQLを使用してUnicode文字列のハッシュを計算しようとしています。以下のコードはASCII文字列で正常に機能します。

declare @input varchar(50)
set @input = 'some text'
print 'SHA1 Hash: ' + UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0))

しかし、コードの最初の行を。に置き換えると、間違ったハッシュが計算されdeclare @input nvarchar(50)ます。

Calculated hash (nvarchar): BBA91B680CE2685E9465DE24967E425CF055B10F
Calculated hash by a tool : 37AA63C77398D954473262E1A0057C1E632EDA77

SHA1のハッシュを計算するにはどうすればよいnvarcharですか?

[編集]:

以下のC#コードは、ハッシュに使用するツールと同じハッシュを生成します。

// Computes SHA1 hash of a given string
string ComputeHash(string input)
{
    string result = string.Empty;
    byte[] hash;
    byte[] bytes = Encoding.GetBytes(input);

    using (var sha = SHA1Managed.Create())
        hash = sha.ComputeHash(bytes);

    foreach (var b in hash)
        result += b.ToString("X2");

    return result;
}
4

1 に答える 1

6

ツールによって返されたハッシュがUTF16、SQL Server によって返されたものと比較したときに、または Unicode エンコーディングを使用していることは確かですか?... SHA1(およびその他のエンコーディング形式) はデータ型に依存するため、与えられたときに異なる値を返す必要があります。入力として。より詳細な説明については、このリンクをご覧ください

于 2011-03-17T17:39:00.483 に答える