如何计算C#中的SQL Server(hashbytes('SHA1',[ColumnName]))的等价物?

Gil*_*Gat 7 c# t-sql sql-server sha

在我的数据库中,我有一个计算列,其中包含一个名为URLString的列的SHA1哈希值,该列保存URL(例如"http://xxxx.com/index.html").

我经常需要查询表以根据URLString列查找特定的URL.该表包含100K,这些查询需要几秒钟(使用SQL Azure).由于URL可能很长,我无法在此列上创建索引(大于450字节).

为了加快速度,我想从C#计算SQL Server哈希字节('SHA1',[URLString])的等效值,并根据此值进行查询.

我尝试了下面的代码,但是我获得的值与数据库计算的值不同.

var urlString = Encoding.ASCII.GetBytes(url.URLString); //UTF8 also fails
var sha1 = new SHA1CryptoServiceProvider();
byte[] hash = sha1.ComputeHash(urlString);
Run Code Online (Sandbox Code Playgroud)

我在这里错过了一些小事吗?
我对其他可以解决相同问题的想法持开放态度(只要SQL Azure支持它们).

示例:在数据库中,URL http://www.whatismyip.org/的自动计算SHA1值为0xAE66CA69A157186A511ED462153D7CA65F0C1BF7.

Jer*_*all 10

您可能会被字符编码差异所困扰:

http://weblogs.sqlteam.com/mladenp/archive/2009/04/28/Comparing-SQL-Server-HASHBYTES-function-and-.Net-hashing.aspx

您可以尝试通过Encoding.ASCII.GetBytes(url)或获取字节,Encoding.Unicode.GetBytes(url)并查看您的数据库正在使用哪个字节.

  • 通常,您可以从INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='Yourtable'中使用“选择TABLE_NAME,COLUMN_NAME,Columns.COLLATION_NAME”来检查用于表/列的排序规则。从排序规则来看,如果它是_CP1_(如SQL_Latin1_General_Cp1_CS_AS),则为Windows-1252;如果是_CP ### _,则###是代码页号(如SQL_Latin1_General_Cp437_CS_AS)是437),否则您必须搜索:-) (2认同)