値のセットのハッシュを生成するときに、結果をHashBytesからbigintに変換する方法を示すブログがいくつか見られます。これはデータウェアハウスでは本当に一般的です。これは、結合に適しており、良好なパーティション分配を提供する整数としてハッシュを格納する利点を有する。SQL ServerのHashBytes varbinaryからBigintへの変換
これは良い練習である場合でも、私は思っています。 HashBytesでSha1を使用すると、16バイトの結果が生成されます。 bigintは8バイトのデータ型なので、これをbigintに変換する前に16バイトを切り捨てる必要はありませんか?もしそうなら、これは衝突の可能性を高めるように思われる。
varbinaryハッシュをかなり長い間bigintに変換していますが、まだ衝突が発生していませんが、上記の前提が真実であれば間違いなく愚かなようです。
これをテストするには、bigintから元のハッシュに戻すことができるかどうかを確認するためにいくつかのハッシュを変換しようとしましたが、問題を示している可能性があります(または、 )。
あなたの数学者はこれについて考えていますか? ありがとうございます!彼らは古いハッシュアルゴリズムを廃止しようとしていることをSQL 2016の最近の兆候で
DECLARE @value varchar(5) = '12345'
DECLARE @hash varbinary(max) = hashbytes('SHA1', @Value)
SELECT @hash AS OriginalHash
SELECT CAST(@hash as nvarchar(max)) AS StringHash
SELECT CAST(CAST(@hash as nvarchar(max)) as varbinary(max)) AS StringBackToOriginalHash
SELECT CAST(@hash as bigint) AS BigIntHash
SELECT CAST(CAST(@hash as bigint) as varbinary(max)) AS BigIntBackToOriginalHash
、我々はかなり多くのスペースを取るだろう長いハッシュあるSha2_256とSha2_512を使用せてしまいます。これは、古いSha1ハッシュと衝突耐性であれば、bigintの使用が素晴らしい理由もあります。