2016-08-03 24 views
2

I Hash-Wert erzeugt habe unter Funktion in SQL mitNeed C# -Äquivalent für die unterhalb SQL HashBytes funktionieren

SQL-Abfrage

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

Jetzt muß ich das äquivalent C# Funktion erhalten, um den Hash zu erhalten Wert und übergeben Sie es an eine gespeicherte Prozedur.

Ich verwende den folgenden Code, um die C# Entsprechung zu erhalten. Aber Werte passen nicht

C# -Code

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; 
} 

Hier sind die Testergebnisse:

von SQL Server:

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

HashValue : 0x104E09499B76CB59420AEEEDBBE187F8 

In C# ich den Wert von DB Feldwert bekommen als unter

[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 

Von C# GetMD5Hash Funktion ich bin immer Wert wie unten

[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 

Jeder möglicher Vorschlag geschätzt.

+2

Beginnen Sie damit, den gleichen Datumswert zu erhalten, bevor er gehashed wird. – Magnus

+2

Sind Sie sicher, dass die Hashing-Funktion nicht gleich funktioniert oder ist die Zeichenfolge, die Sie Hashing verwenden, anders? Was genau macht 'PNumber + CONVERT (VARCHAR (50), cast (Datumsstempel als binär), 1)' in SQL im Vergleich zu 'PNumber + Encoding.Unicode.GetBytes (strDate)'? – Jacob

+0

Was ist der Typ des Datumsstempels? Ist es eine Schnur? – Ben

Antwort

2

In C# sieht es aus wie das Format für ein DateTime- ToString() ist mehr wie folgt aus:

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

Ich glaube, du Hashing zwei verschiedenen Saiten. Damit die Hashes übereinstimmen, müssen Sie die Daten vor dem Berechnen des Hashwerts gleich formatieren.

Auch sieht es aus wie auf SQL-Server, den Sie Hashing so etwas wie:

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

Ein weiteres Problem dieses sein könnte:

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

Ihre Konvertierungen zwischen Strings und Bytes ausgeschaltet ist.

+0

Ich habe das Problem gefunden. Aber ich kenne die Lösung nicht. Problem ist mit der Spalte sql datetime. Es nimmt ein anderes Format an. Ich habe dafür eine eigene Frage gestellt. Bitte sehen Sie sich das an. http://stackoverflow.com/questions/38761149/hashbytes-computed-column-cannot-be-peristed-because-the-column-is-no-determinin –