C#.NET 中的 MD5 哈希码

MD5 HashCode in C#.NET

如何绕过在 SQL Server 2012 中创建哈希码的 8000 个字符限制,

 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# 语法中是不同的。

提前致谢。

当使用 SQL 服务器的 varchar 数据类型时,要使用的 .Net 编码是 UTF8,因为它是三种编码(ASCII、UTF7、UTF8)中最快和最优化的。当使用 nvarchar 数据类型时,它是 Unicode (UTF16),但我们还必须知道文本字节顺序以创建正确的哈希值。

例子:

点网:

string source = "Sample string with more than 8000 Characters";
using (MD5 md5Hash = MD5.Create()) 
{ 
    Console.WriteLine(GetMd5Hash(md5Hash, source, System.Text.Encoding.ASCII)); <br/>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

declare @val1 varchar(50),
    @val2 nvarchar(50),
    @val3 char(50),
    @val4 nchar(50)

-- 示例 1 byte/char 文本
-- 所有变量长度相同

select  @val1 =  'Sample string with more than 8000 Characters'
    @val2 = N'Sample string with more than 8000 Characters',
    @val3 =  'Sample string with more than 8000 Characters',
    @val4 = N'Sample string with more than 8000 Characters'

-- 所有 4 return 个不同的结果

select  HASHBYTES('md5', @val1) as MD5_varchar,    
-- result = 0xAE1C585474D90965ED832A7E588D4AF4
-- just to show that collation doesnot change the hash
HASHBYTES('md5', @val1 collate Cyrillic_General_BIN2) as MD5_varchar_collation, 
-- result = 0xAE1C585474D90965ED832A7E588D4AF4
HASHBYTES('md5', @val2) as MD5_Nvarchar,    
-- result = 0x880632484491D1283818B7A3AE3D2AFC
HASHBYTES('md5', @val3) as MD5_char,        
-- result = 0x77D2A2CF22998C4CD5AD5550664BF931
HASHBYTES('md5', @val4) as MD5_Nchar        
-- result = 0x9B55DF00EAFE01D764BB944592C27521

Database Image