【发布时间】:2021-12-09 01:34:20
【问题描述】:
在 SQL Server 中使用 c# 创建哈希是不同的。为什么不一样?
using (SHA1Managed sha1 = new SHA1Managed())
{
Guid g = new Guid("81FE483B-39ED-4052-8FFC-55A710907D9B");
var appGateId = g.ToString();
var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(appGateId));
var sb = new StringBuilder();
foreach (byte b in hash)
{
sb.Append(b.ToString("x2"));
}
Console.WriteLine(sb.ToString());
}
这里的结果是ebb52fefab48f428b6ee03174276c8ade0b4ef1a。
使用 SQL Server 和此代码:
declare @a uniqueidentifier = '81FE483B-39ED-4052-8FFC-55A710907D9B', @b nvarchar(50)
select @b = CONVERT(nvarchar(50), @a)
select convert(varchar(50), hashbytes('SHA1', @b), 2)
结果是CC34B1E702F6E7FE0EE92ED4D5390BB4765B9A21
【问题讨论】:
-
我希望在 sql server 中创建的哈希应该和在 c# 中创建的一样
-
计算 guid 字符串的 UTF8 哈希与计算 guid 的哈希非常不同;一个 guid 是 16 个字节 - 你正在散列 36 个字节;然后需要考虑字节顺序; guid 的字节顺序是……复杂,不同的系统使用不同的规则;但是:如果您乐于在此处使用字符串:还需要区分大小写;您的 TSQL 版本以大写结尾,C# 版本以小写结尾
-
最后:为什么要在这里散列? guid 更短
标签: c# sql-server asp.net-mvc hashbytes