2016-12-01 22 views
1

私はこのハードコードさを実行すると、私は正しい結果を得る:SQL Serverハッシュ変換の不一致?

Declare @result nvarchar(32) 

Set @result = convert(varchar(32), hashbytes('MD5', '1' + 'One' + 'Two' + 'Three'), 2) 

select @result 

結果: 4173AB4C6EE66BC1FF7B7E5D44A872CA(正しい)

をしかし、私はそれを同じパラメータを与えて、このストアドプロシージャを実行する/呼び出すとき、それはです異なる結果

ALTER Procedure [db_owner].[CheckTheTransaction] 
    @DataID nvarchar(50), 
    @Data1 nvarchar(50), 
    @Data2 nvarchar(50), 
    @Data3 nvarchar(50) 
as 
    Declare @result nvarchar(32) 
    Set @result = convert(varchar(32), hashbytes('MD5', @DataID + @Data1 + @Data2 + @Data3), 2) 

    Select @result 

マイ実行:

DECLARE @result int 

EXEC @result = [db_owner].[CheckTheTransaction] 
     @DataID = '1', 
     @Data1 = 'One', 
     @Data2 = 'Two', 
     @Data3 = 'Three' 

SELECT 'Result' = @result 

GO 

結果:私は間違って行くのです 5BD42777932EE959AD5A4C9FEE142F00(間違った)

? varchar型として

+0

「1」はVARCHARで、NVARCHARを渡していると思います。私は両方の値が正しいことを賭けて喜んで - ちょうど第2のものはUTF16です。 –

+0

ハッシュ関数は一般的に悪いようですが、 '@ Data1 = 'XX'、@ Data2 = 'YY''、' @ Data1 =' XXY '、@ Data2 =' Y''は同じハッシュ値を返します。 –

答えて

1

変更すべてのnvarcharデータ型

ALTER Procedure [db_owner].[CheckTheTransaction] 
@DataID varchar(50), 
@Data1 varchar(50), 
@Data2 varchar(50), 
@Data3 varchar(50) 
as 
    Declare @result nvarchar(32) 
    Set @result = convert(varchar(32), hashbytes('MD5', @DataID + @Data1 +   
    @Data2 + @Data3), 2) 

Select @result 
+0

それはうまくいきましたが、今私はæøåのような文字をそれに与えることができません – humudu

+0

おそらくUTF8でエンコードされたテキストが必要です。 ASCII文字= 1バイト、空想文字= 1バイト以上。これは実際にはSQL Serverでは一種難しいものです。 http://stackoverflow.com/questions/12512687/sql-server-utf8-howto –

2

これはデータ型の問題です。 T-SQスクリプトを以下のように変更することで、それが一致することがわかります。

宣言@resultのNVARCHAR(32)

セット@result =変換(VARCHAR(32)、hashbytes( 'MD5'、N'1' + N'One '+ N'Two' + N'Three ')、2)

select @result

関連する問題