【发布时间】:2015-05-19 19:53:02
【问题描述】:
我想同时拥有 c# 级别和 sql server 2012 级别。
我如何知道 SHA1 实现是否会产生相同的结果?
在我正在做的 sql server 中:
HASHBYTES('SHA1', @data)
我还没有编写我的 c# 函数。
我只是担心如果它们不产生相同的哈希值,我的应用程序会出现一些不一致。
注意:我将用于创建哈希的列是 datetime、nvarchar 和 int。我必须将这些转换为正确的字符串吗?
【问题讨论】:
-
在转换为字符串时,您可能会发现的唯一区别是大写字母与小写字母的区别。
SHA是一个已定义的标准,因此 任何 语言/构造声称提供SHA1哈希 必须 返回相同的字节值输出。正如我所说,唯一的区别可能是string表示。 (对于相同的两个字节,您可能会看到FEFF而不是feff,分别为254和255。)您也可能会发现这是一个很好的阅读:stackoverflow.com/questions/14146636/… -
回答是肯定的。这里有一个几乎可以运行的示例代码:stackoverflow.com/q/30155754/613130 注意
char/varchar列的编码(排序规则)!请注意,NUMBER 列和 DATETIME、SMALLDATETIME 肯定需要一些特殊处理。最后,任何不是 varchar/nvarchar/int/smallint/bigint 的东西都需要特殊处理。 -
@Cadburry 该链接是由似乎不理解排序规则对哈希的影响的人编写的:他写 只是为了表明排序规则不会改变哈希 , 但是
SELECT '€' COLLATE SQL_Latin1_General_Cp1250_CS_AS, HASHBYTES('sha1', '€' COLLATE SQL_Latin1_General_Cp1250_CS_AS), '€' COLLATE SQL_Latin1_General_Cp1251_CS_AS, HASHBYTES('sha1', '€' COLLATE SQL_Latin1_General_Cp1251_CS_AS)(sqlfiddle sqlfiddle.com/#!6/9eecb7db59d16c80417c72d1/1021),并且在不止一页的博客中没有为“标准”排序规则花费一个字(如 SQL_Latin1_General_CP1_CI_AS)
标签: c# sql-server hash hashbytes