2016-08-05 54 views
0

如何能繞過SQL Server 2012中創建散列碼的8000個字符的限制,MD5的hashCode C#.NET

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', 'Sample 
string with more than 8000 Characters')),3,32) as MD5HashCode 

我嘗試用C#語法工作。

String str = "Sample string with more than 8000 Characters" 
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
byte[] bs = System.Text.Encoding.Unicode.GetBytes(str); 
bs = x.ComputeHash(bs); 
System.Text.StringBuilder s = new System.Text.StringBuilder(); 
    foreach (byte b in bs) 
    { 
    s.Append(b.ToString("x2").ToLower()); 
    } 

但是,計算出的HashCode SQL查詢在C#語法中是不同的。

在此先感謝。

+0

的可能的複製[TSQL MD5哈希到C#的.NET MD5不同](http://stackoverflow.com/questions/27908449/tsql -md5公頃sh-different-to-c-sharp-net-md5) – Mark

回答

2

當使用SQL Server的varchar數據類型時,.Net編碼所使用的是UTF8,因爲它是三種(ASCII,UTF7,UTF8)中速度最快和最優化的。當使用nvarchar數據類型去使用Unicode(UTF16)時,但我們也必須知道文本的字節順序才能創建正確的散列。

示例:
DotNet:
string source =「具有多於8000個字符的示例字符串」;
使用(MD5 md5Hash = MD5.Create())
{
Console.WriteLine(GetMd5Hash(md5Hash,source,System.Text.Encoding.ASCII));
Console.WriteLine(GetMd5Hash(md5Hash,source,System.Text.Encoding.UTF7));
Console.WriteLine(GetMd5Hash(md5Hash,source,System.Text.Encoding.UTF8));
Console.WriteLine(GetMd5Hash(md5Hash,source,System.Text.Encoding.Unicode));
Console.WriteLine(GetMd5Hash(md5Hash,source,System.Text.Encoding。UTF32));
}

DotNet Image

數據庫:
- 注意大小的所有數據類型的15
聲明@ VA​​L1 VARCHAR(50),
@ VAL2爲nvarchar(50),
@ VAL3 CHAR(50 ),
@ VAL4的nchar(50)

- 例如1個字節/字符文本的
- 所有變量都是相同長度的
選擇@ VAL1 =「薩具有超過8000個字符的字符串',
@ val2 = N'Sample字符串,字符數超過8000個',
@ val3 ='樣本字符串超過8000個字符',
@ val4 = N'Sample string with超過8000個字符

- 所有4個返回不同的結果
選擇HASHBYTES( 'MD5',@ VAL1)作爲MD5_varchar,
- 結果= 0xAE1C585474D90965ED832A7E588D4AF4
- 只是爲了顯示排序規則不會改變散列
HASHBYTES('md5',@ val1 collat​​e Cyrillic_General_BIN2)as MD5_varchar_collat​​ion,
- result = 0xAE 1C585474D90965ED832A7E588D4AF4
HASHBYTES( 'MD5',@ val2)將作爲MD5_Nvarchar,
- 結果= 0x880632484491D1283818B7A3AE3D2AFC
HASHBYTES( 'MD5',@ VAL3)作爲MD5_char,
- 結果= 0x77D2A2CF22998C4CD5AD5550664BF931
HASHBYTES( 'MD5',@ VAL4)作爲MD5_Nchar
- 結果= 0x9B55DF00EAFE01D764BB944592C27521


Databse Image

+0

感謝您的解釋,現在我意識到了每種Encoding類型之間的區別。我選擇了UTF8。 –