2011-10-14 22 views

答えて

5

入力の8k(または4kまたは2k)チャンクをハッシュし、それらのハッシュを連結したり、新しいハッシュ値にハッシュしたりすることができます。 SQL Serverの外部で作成されたハッシュを比較するために、類似のアルゴリズム(外部の.NETアプリケーションなど)を作成する必要がある場合、これは困難になる可能性があります。

もう1つのオプション:SQL ServerのCLR integrationに傾け、.NETアセンブリでハッシングを実行します。

+1

ありがとうPaul、それは内部使用のための本当に良い解決策です。このケースでは、sha1 – SDReyes

+1

@SDReyesに完全に準拠する必要があります。私の答えに追加された別のアイデア:SQL ServerのCLR統合に頼り、.NETアセンブリでハッシングを実行します。 –

2

ポールのアイデアのように、チャンク化には、各チャンクを別々のXML要素として、XML列にハッシュされた文字列を格納することが考えられます。

+0

+1データの整合性のために、私は単一のハッシュ値を格納することを提案します(ハッシュのハッシュ)。XML構造では、ハッシュ値をN番目のチャンクのインデックスにマップする特別な属性が必要ですハッシュされたデータ –

9

あなたは、SQL CLR機能書くことができます:

[Microsoft.SqlServer.Server.SqlFunction] 
public static SqlBinary BigHashBytes(SqlString algorithm, SqlString data) 
{ 
    var algo = HashAlgorithm.Create(algorithm.Value); 

    var bytes = Encoding.UTF8.GetBytes(data.Value); 

    return new SqlBinary(algo.ComputeHash(bytes)); 
} 

をし、それは次のようにSQLで呼び出すことができます。長さは8K上であるかどう

--these return the same value 
select HASHBYTES('md5', 'test stuff') 
select dbo.BigHashBytes('md5', 'test stuff') 

BigHashBytesにのみ必要です。

+7

CLR SPパラメータが8000バイトに自動的に切り捨てられるので注意してください。パラメータに '[SqlFacet(MaxSize = -1)]'を付けなければなりません。それを得るために私をしばらくかかった! – randomdude

+0

-1(誤ってUTF-8を使用することになった) SQL Server(および一般的なWindows)はUTF-16を使用します。したがって、現在コードポイント0〜127、またはおそらく256までしか使用していない多くの人々にとっては、これはうまくいくように見えますが、UTF-8を使用すると次のような問題が発生します:[ComputeHashに基づくSQL CLR関数は(http://stackoverflow.com/a/35273859/577765) –

+0

@randomdudeあなたの経験は、古いバージョンのSSDTがT-SQLラッパーオブジェクトをどのように生成したかによるものです。デフォルトでは 'SqlString'に' NVARCHAR(4000) 'を使い、' SqlChars'には 'NVARCHAR(MAX)'を使いました。しかし、Visual Studio 2013の時代の頃から、デフォルトは 'NVARCHAR(MAX)'を使用するように変更されました。それでも、あなたが言及しているように、明示的に '[SqlFacet()]'を使用する方が良いですが、新しいSSDTバージョンを使用している人はそれに踏み込めません。また、SQLCLRは 'NVARCHAR'だけをサポートしているので、実際には4000文字で切り詰めます:-)。 –

関連する問題