【问题标题】:C# hash and sql server's hashbytel function, same implementation?C# hash 和 sql server hashbytes 函数,相同的实现?
【发布时间】: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,分别为 254255。)您也可能会发现这是一个很好的阅读: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


【解决方案1】:

使用此代码不会有任何问题:

    public static byte[] GetHash(string inputString)
    {
        HashAlgorithm algorithm = SHA1.Create();
        return algorithm.ComputeHash(Encoding.Unicode.GetBytes(inputString));
    }

它创建的 散列 与您在 SQL Server 上创建的一样:

HASHBYTES('SHA1', CAST(@data AS NVARCHAR(100)))

【讨论】:

  • 如果可以确定,SQL Server 不使用 UTF8 作为其编码。
  • 很奇怪。我从来没有遇到过任何问题,而且我多年来一直在使用这个代码......
  • “在 SQL Anywhere 中,NVARCHAR 数据类型包含使用 UTF-8 编码的字符(因此正常的 ASCII 字符大小为一个字节)。” sqlanywhere-forum.sap.com/questions/19446/…
  • SQL Anywhere 不是 SQL Server:en.wikipedia.org/wiki/SQL_AnywhereSAP SQL Anywhere 是 SAP 的专有关系数据库管理系统 (RDBMS) 产品。在 SAP 收购 Sybase 之前,SQL Anywhere 被称为 Sybase SQL Anywhere。
  • 据我所知没有......但如果你想要一个字节数组,Encoding.Unicode.GetBytes(inputString) 就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2010-09-09
  • 2014-06-28
相关资源
最近更新 更多