【问题标题】:Need C# equivalent for the below SQL HashBytes function需要以下 SQL HashBytes 函数的等效 C#
【发布时间】:2016-08-03 14:35:41
【问题描述】:

我在 sql 中使用以下函数创建了哈希值

SQL 查询

Select hashbytes('MD5', PNumber+CONVERT(VARCHAR(50),cast(datestamp as  binary),1))   
From dbo.Events

现在我需要获取等效的 C# 函数以获取哈希值并将其传递给存储过程。

我正在使用下面的代码来获得等效的 c#。但是值不匹配

C#代码

var strDate = policyEventFromQueue.DateStamp.ToString();
var binaryvalue = Encoding.Unicode.GetBytes(strDate);
var hashkey = GetMD5Hash(PNumber + binaryvalue);

public static byte[] GetMD5Hash(string input)
{
    System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
    byte[] bs = System.Text.Encoding.Unicode.GetBytes(input);

    bs = x.ComputeHash(bs);
    return bs;
}

以下是测试结果:

来自 SQL Server:

PNumber ='4272535529'
DateStamp ='2016-06-30 12:19:35.257961'

HashValue : 0x104E09499B76CB59420AEEEDBBE187F8

在 C# 中,我从 DB 字段值中获取值,如下所示

[0]: 16
[1]: 78
[2]: 9
[3]: 73
[4]: 155
[5]: 118
[6]: 203
[7]: 89
[8]: 66
[9]: 10
[10]: 238
[11]: 237
[12]: 187
[13]: 225
[14]: 135
[15]: 248

从 C# GetMD5Hash 函数我得到的值如下

[0]: 30
[1]: 153
[2]: 105
[3]: 203
[4]: 34
[5]: 124
[6]: 20
[7]: 12
[8]: 207
[9]: 113
[10]: 210
[11]: 144
[12]: 18
[13]: 145
[14]: 22
[15]: 36

任何建议将不胜感激。

【问题讨论】:

  • 首先在哈希之前获取相同的日期值。
  • 您确定散列函数的工作方式不同,还是您要散列的字符串不同?与PNumber + Encoding.Unicode.GetBytes(strDate) 相比,SQL 中的PNumber+CONVERT(VARCHAR(50),cast(datestamp as binary),1) 到底是什么样的?
  • 日期戳的类型是什么?是字符串吗?
  • 使用 BitConverter.ToString(bs);然后用空字符串替换所有“-”。
  • 我已经用测试结果编辑了我的问题

标签: c# sql-server database hashbytes


【解决方案1】:

在 c# 中,DateTime ToString() 的格式看起来更像这样:

DateTime.Now.ToString()
//--------
"8/3/2016 4:11:14 PM"

我认为您正在散列两个不同的字符串。为了使哈希值匹配,您需要在计算哈希值之前将日期格式设置为相同。

在 sql server 上看起来你正在散列类似的东西:

select '12313135' + CONVERT(VARCHAR(50),cast(sysdatetime() as  binary),1)
//------------
123131350x077B7127E688B23B0B000000000000000000000000000000

另一个问题可能是这样的:

var binaryvalue = Encoding.Unicode.GetBytes(DateTime.Now.ToString());
var hashkey = "123456" + binaryvalue;
Console.WriteLine(hashkey)
//----------
123456System.Byte[]

字符串和字节之间的转换已关闭。

【讨论】:

  • 我发现了问题。但我不知道解决方案。问题出在 sql datetime 列上。它采用不同的格式。我为此发布了一个单独的问题。请看一下。 stackoverflow.com/questions/38761149/…
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多