HashBytesをVarCharに変換


127

SQL Server 2005で文字列値のMD5ハッシュを取得します。これを行うには、次のコマンドを使用します。

SELECT HashBytes('MD5', 'HelloWorld')

ただし、これはVarChar値の代わりにVarBinaryを返します。0x68E109F0F40CA72A15E05CC22786F8E6VarCharに変換しようとすると、のhá ðô§*à\Â'†øæ代わりに取得され68E109F0F40CA72A15E05CC22786F8E6ます。

SQLベースのソリューションはありますか?

はい

回答:


147

私は他の場所で解決策を見つけました:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)

19
fn_varbintohexstrは文書化されていない関数です。CONVERT(Char、@ value、2)を使用
Cheburek

倉庫に更新する方法が必要なので、varbinaryに少し気づきました。これは魅力のように働きました!おかげで...
nitefrog 2011

この方法は非常に遅く、文書化されていない関数を使用するため、Azureでは機能しません。クールではありません。代わりに変換を使用してください!
Rocklan、2012

4
CONVERT()はSQL 2005では機能しません。SQL2008以降を使用している場合は、必要に応じてCONVERT()を使用してください。悲しいことに、私はすべてのSQLバージョンで機能する単一のコマンドを認識していません。そのため、スクリプトでクレイジーなバージョンチェックを行うか、SQLバージョンをアップグレードする場合に関数を修正する必要があることをメモしてください。
カールブセマ

5
CONVERT(Char、@ value、2)は32バイトのみを出力します。これをsha1ハッシュに実行すると、切り捨てられます。適切な出力を維持するには、convert(char(48)、@ value、2)が必要です。
Andrew Hill

82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)

4
これはSQL Azureで機能します。SHA1の場合:SELECT CONVERT(VARCHAR(40)、HashBytes( 'SHA1'、 'Hello World')、2)
Raptor

4
nvarcharを不必要に使用する必要はありません。
Ian Kemp

3
質問にはSQL Server 2005が含まれており、上記の提案のいずれか(およびおそらく他のバージョンも)を実行すると、要求されたことが実行されません。求められている16進文字列としてのバイトではなく、バイトと同等の文字を取得します。GateKillerとXarqronがその答えを出します。
デビッドナイト

これらの変換スタイルについてどこで読むことができますか?この場合、パラメータとして渡される2。そして、C#コードで同等のものを作成するにはどうすればよいですか?どのエンコーディングを選択すればよいですか?
Dmytro Zhluktenko 2017年

31

使用master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)する代わりにmaster.dbo.fn_varbintohexstr、その後substringingの結果。

実際にfn_varbintohexstrfn_varbintohexsubstring内部的に呼び出します。の最初の引数は、プレフィックスとしてfn_varbintohexsubstring追加する0xFかどうかを指定します。fn_varbintohexstr呼び出すfn_varbintohexsubstring1内部的最初の引数として。

必要ないので0xFfn_varbintohexsubstring直接お電話ください。


27

David Knightの言うことに反して、これらの2つの選択肢はMS SQL 2008で同じ応答を返します。

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))

したがって、バージョン2008以降、最初の方がより良い選択のようです。


微妙に異なる答えを与える誤ってこれを入力しないでください!... convert(varchar、HashBytes( 'MD5'、 'Hello World'))、2)
andrew pate

13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(16進数を文字列に変換するための1)

これをより低い値に変換し、部分文字列によって文字列の先頭から0xを削除します。

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)

バイトを文字列に変換した後のC#で得られるものとまったく同じ


2

ドキュメント化されていませんが、SP変数をハッシュしたストアドプロシージャ内で次のコードを使用した個人的な経験により、この例では、この組み合わせは100%機能します。

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)

-3

データ型をvarbinaryに変更することは、私にとって最もうまくいくようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.