2016-08-03 75 views
2

我已經創建了在SQL中使用下面的函數的散列值需要C#等同於下面的SQL HASHBYTES功能

SQL查詢

Select hashbytes('MD5', PNumber+CONVERT(VARCHAR(50),cast(datestamp as binary),1)) 
From dbo.Events 

現在我需要得到等價的C#功能,以獲得哈希值並將其傳遞給存儲過程。

我正在使用下面的代碼來獲得C#等效。但值不匹配

C#代碼

var strDate = policyEventFromQueue.DateStamp.ToString(); 
var binaryvalue = Encoding.Unicode.GetBytes(strDate); 
var hashkey = GetMD5Hash(PNumber + binaryvalue); 

public static byte[] GetMD5Hash(string input) 
{ 
    System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
    byte[] bs = System.Text.Encoding.Unicode.GetBytes(input); 

    bs = x.ComputeHash(bs); 
    return bs; 
} 

以下是測試結果:

從SQL Server:

PNumber ='4272535529' 
DateStamp ='2016-06-30 12:19:35.257961' 

HashValue : 0x104E09499B76CB59420AEEEDBBE187F8 

在C#中,我從數據庫字段值所獲得的價值爲低於

[0]: 16 
[1]: 78 
[2]: 9 
[3]: 73 
[4]: 155 
[5]: 118 
[6]: 203 
[7]: 89 
[8]: 66 
[9]: 10 
[10]: 238 
[11]: 237 
[12]: 187 
[13]: 225 
[14]: 135 
[15]: 248 

從C#GetMD5Hash功能我得到的值,如下

[0]: 30 
[1]: 153 
[2]: 105 
[3]: 203 
[4]: 34 
[5]: 124 
[6]: 20 
[7]: 12 
[8]: 207 
[9]: 113 
[10]: 210 
[11]: 144 
[12]: 18 
[13]: 145 
[14]: 22 
[15]: 36 

任何建議將受到讚賞。

+2

從散列前獲取相同的日期值開始。 – Magnus

+2

你確定哈希函數的工作方式不一樣,或者你哈希的字符串是不同的?與PNumber + Encoding.Unicode.GetBytes(strDate)'相比,'PNumber + CONVERT(VARCHAR(50),cast(datestamp as binary),1)'看起來像SQL嗎? – Jacob

+0

datestamp的類型是什麼?它是一個字符串嗎? – Ben

回答

2

在C#中,它看起來像一個日期時間的ToString格式()更是這樣的:

DateTime.Now.ToString() 
//-------- 
"8/3/2016 4:11:14 PM" 

我想你哈希兩個不同的字符串。爲了匹配哈希值,在計算哈希值之前,需要格式化相同的日期。

而且它看起來像SQL Server上你哈希是這樣的:

select '12313135' + CONVERT(VARCHAR(50),cast(sysdatetime() as binary),1) 
//------------ 
123131350x077B7127E688B23B0B000000000000000000000000000000 

另一個問題可能是這樣的:

var binaryvalue = Encoding.Unicode.GetBytes(DateTime.Now.ToString()); 
var hashkey = "123456" + binaryvalue; 
Console.WriteLine(hashkey) 
//---------- 
123456System.Byte[] 

您的轉換字符串之間和字節是關閉的。

+0

我發現了這個問題。但我不知道解決方案。問題在於sql datetime列。它採取不同的格式。我已經爲此發佈了一個單獨的問題。請看看這個。 http://stackoverflow.com/questions/38761149/hashbytes-computed-column-cannot-be-persisted-because-the-column-is-non-determin –