簡體   English   中英

SQL Uniqueidentifier 和 hashbytes 與 c# 不匹配

[英]SQL Uniqueidentifier and hashbytes does not match with c#

在 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

@ Marc Gravell的評論在這里解釋了這個問題。 在 C# 中,您使用的是 UTF-8 字符串,但在 SQL Server 中,您使用的是nvarchar ,它是 UTF-16; 這些沒有可比性。

但是,如果您實際使用varchar並將字符更改為小寫(因為在 T-SQL 中轉換為基於字符串的數據類型時, uniqueidentifier將更改為大寫),您得到相同的值。 您也可以(如果您使用的是 2019+)明確地將值整理為 UTF-8 值,但考慮到 GUID 僅由十六進制字符 (0-9A-F) 組成,這似乎有點毫無意義:

DECLARE @a uniqueidentifier = '81FE483B-39ED-4052-8FFC-55A710907D9B', @b varchar(50);
SELECT @b = LOWER(CONVERT(varchar(50), @a));

SELECT @b, LOWER(CONVERT(varchar(50), HASHBYTES('SHA1', @b), 2));

為了讓這些等價,你有兩個問題:

  • 如前所述,您正在請求 UTF-8,而 SQL Server 正在使用 UTF-16
  • C# 生成小寫,SQL Server 生成大寫

您可以更改 C# 代碼

using (SHA1Managed sha1 = new SHA1Managed())
{
    Guid g = new Guid("81FE483B-39ED-4052-8FFC-55A710907D9B");
    var appGateId = g.ToString().ToUpper().Dump();

    var hash = sha1.ComputeHash(Encoding.Unicode.GetBytes(appGateId));
    var sb = new StringBuilder();

    foreach (byte b in hash)
    {
        sb.Append(b.ToString("x2"));
    }

    Console.WriteLine(sb.ToString());
}

網絡小提琴

或者您可以更改 SQL Server 代碼

declare @a uniqueidentifier = '81FE483B-39ED-4052-8FFC-55A710907D9B', @b varchar(50)

select @b = LOWER(CONVERT(varchar(50), @a))
select convert(varchar(50), hashbytes('SHA1', @b COLLATE Latin1_General_100_BIN2_UTF8 ), 2)

數據庫<>小提琴


老實說,我不明白你為什么要散列字符串表示 您可以輕松地散列實際的 Guid 字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM