Нужен эквивалент C# для функции SQL HashBytes ниже

Я создал хэш-значение с помощью функции ниже в 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# я получаю значение из значения поля БД, как показано ниже

[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

Любое предложение будет оценено.

1 ответ

Решение

В C# похоже, что формат DateTime ToString() больше похож на этот:

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

Я думаю, что вы хэшируете две разные строки. Для совпадения хэшей вам нужно отформатировать даты одинаково, прежде чем вычислять значение хеша.

Также похоже, что на сервере sql вы хэшируете что-то вроде:

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[]

ваши преобразования между строками и байтами отключены.

Другие вопросы по тегам