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
如何绕过在 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