【问题标题】:Almost the same Hash value几乎相同的哈希值
【发布时间】:2020-11-04 22:13:46
【问题描述】:

目标:
从 SQL 和 C# 代码中检索相同的哈希值。

问题:
哈希值几乎相同。我正在使用相同的哈希和 sha。

输入:
“你好,世界!”

C#代码:
https://dotnetfiddle.net/2YbFXY

SQL 代码:

DECLARE @HashThis varchar(32);  
SET @HashThis = CONVERT(varchar(32),'Hello World!');  
SELECT HASHBYTES('SHA2_256', @HashThis);

输出:
C#代码结果:

“7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069”

SQL 代码结果:

“0x7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069”

有没有好的或推荐的方法来删除数据“0x”?

谢谢!

【问题讨论】:

  • this 有帮助吗?否则,您可以使用StartsWith 检测散列中的0x 并删除前两个字符。
  • 你可以说哈希码是一样的,只是表示不同。删除 0x 和小写使其适合比较。
  • 哈希值相同,格式不同。 hash 无论如何都不是字符串,而是二进制值。如果要存储和比较实际的哈希值,请不要将它们格式化为字符串
  • 您必须将哈希值转换为字符串吗?真正的哈希值是 C# 代码中的 byte[] data 变量和 HASHBYTES 返回的二进制值

标签: c# sql hash


【解决方案1】:

改变 SELECT HASHBYTES('SHA2_256', @HashThis);

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_256', @HashThis)), 3, 64)

取自Convert HashBytes to VarChar

正如@Magnus 在 cmets 中指出的那样,子字符串长度应为 64。

【讨论】:

  • 应该是 64 而不是 32
  • 最后的32是子串函数的长度参数
  • 这使得字符串变短
【解决方案2】:

应该这样做:

DECLARE @HashThis varchar(32);  
SET @HashThis = CONVERT(varchar(32),'Hello World!');  
SELECT CONVERT(char(64), HASHBYTES('SHA2_256', @HashThis), 2)

但是,如果您将二进制文件发送到数据库,您应该能够将其与 HASHBYTES 的结果进行比较,而无需进行任何转换。如果您将其作为字节 [] 提供给您的 C# 应用程序,则相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多