Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
散列在SQL和C#中是不同的?_C#_Sql_Sql Server 2012 - Fatal编程技术网

散列在SQL和C#中是不同的?

散列在SQL和C#中是不同的?,c#,sql,sql-server-2012,C#,Sql,Sql Server 2012,我的数据库里有SQL DECLARE @InputString nvarchar(15) ='pass' DECLARE @InputSalt nvarchar(36) = 'FC94C37C-03A3-49A3-9B9F-D4A82E708618' DECLARE @HashThis nvarchar(100) Declare @BinaryHash varbinary(max) set @HashThis = @InputString + @InputSalt set @BinaryHas

我的数据库里有SQL

DECLARE @InputString nvarchar(15) ='pass'
DECLARE @InputSalt nvarchar(36) = 'FC94C37C-03A3-49A3-9B9F-D4A82E708618'

DECLARE @HashThis nvarchar(100)
Declare @BinaryHash varbinary(max)
set @HashThis = @InputString + @InputSalt
set @BinaryHash= HASHBYTES('SHA1', @HashThis) 
SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:variable("@BinaryHash")))', 'VARCHAR(MAX)')
而C#我有

但是散列是不同的

C# Output: S55Nz1lyGweoJEHWcC6zFxJDKWQ=
SQL Output: 4jqyC1pLJ0hW+AMNk8GOWCC99KY=

哈希函数在字节上运行,而不是在字符上运行。您可以有效地将字符转换为字节,但在C#中的转换方式与在SQL中的转换方式不同:从SQL中使用
nvarchar
(UTF-16),从C#中使用UTF-8。您可以更改其中一个以匹配另一个


由于当前测试中没有任何非ASCII字符,因此对于该特定密码,只需将SQL中的
nvarchar
更改为
varchar
,即可轻松验证问题是否存在。但是,这对于整个Unicode字符范围来说是不够的。

这两个字符的输出是什么?@CodeCaster,升级后的postC值(S55Nz1lyGweoJEHWcC6zFxJDKWQ=)似乎是输入的正确值,需要修复SQL代码。好的,谢谢我如何更新C代码。我无法更新SQL,因为我们现有的系统基于此。我已将UTF-8更改为UTF-16,
system.Text.Encoding.Unicode.GetBytes(cleartext)
及其工作原理。这是正确的修复方法吗?当我们使用阿拉伯语字符时,它不起作用。请帮我把这个修好。我只能换C#
C# Output: S55Nz1lyGweoJEHWcC6zFxJDKWQ=
SQL Output: 4jqyC1pLJ0hW+AMNk8GOWCC99KY=