Avatar billede ravelab Praktikant
10. september 2018 - 15:56 Der er 8 kommentarer

Gemme hashlib.md5 som binary(16) værdig

Hej Alle,

Skal være i Python 2.7.x

Hvordan omdanner jeg eller konventer en md5 hashværdig til binary(16)? I denne test lejer vi med hashing af 'åååå'

import hashlib
print str.upper(hashlib.md5("ååååå").hexdigest())

Giver følgende resultat = "E43CF8983B6600D08D181D882E1CF3EA"

Forventet resultat skal være følgende, men bare med en data længde på 16 karakter når det gemmes som binary(16) i en SQL database.
0xE43CF8983B6600D08D181D882E1CF3EA
Avatar billede erikjacobsen Ekspert
10. september 2018 - 16:06 #1
Microsoft SQL Server?  Du bør kunne konvertere din hex-streng med:

  CONVERT(BINARY(16),'E43CF8983B6600D08D181D882E1CF3EA')

i en INSERT-sætning.
Avatar billede erikjacobsen Ekspert
10. september 2018 - 16:11 #2
Nåh ja, det er en smule mere kompliceret

CONVERT(BINARY(16),'0xE43CF8983B6600D08D181D882E1CF3EA',1)
Avatar billede erikjacobsen Ekspert
10. september 2018 - 16:14 #3
Eller bruge style=2, og så uden '0x':

CONVERT(BINARY(16),'E43CF8983B6600D08D181D882E1CF3EA',2)
Avatar billede ravelab Praktikant
10. september 2018 - 16:16 #4
Ved godt at du kan dette, men prøver at holde selve hash funktionen til Python kun og lade den lægge det færdige resultat ind i en binary(16) kolonne.
Håber at det kan lade sig gøre at opnå det fulde resultat 100% i Python uden brugen af SQL convert ved insert processen.

PS: select convert(binary(16),'E43CF8983B6600D08D181D882E1CF3EA',2) = 0xE43CF8983B6600D08D181D882E1CF3EA

Så der er ikke behov for at lave en binary linje om til binary en gang mere ;)
Avatar billede erikjacobsen Ekspert
10. september 2018 - 16:51 #5
Det kan ikke lade sig gøre uden en passende CONVERT direkte i en SQL-sætning, men kan du ikke direkte anvende et byte-array som parameter til en BINARY(16) i et prepared statement?   

Jeg har ikke lige kræfter til at prøve selv ;)
Avatar billede ravelab Praktikant
11. september 2018 - 09:31 #6
Har prøvet at leje lidt rundt med bytearray, men syndes ikke helt at jeg kan få det til at virke, men det bliver sagt på stackoverflow at det er den rigtige vej frem. Er det noget nogen kan hjælpe med? Er nemlig ikke Python mester og kan kun det jeg kan google mig frem til.

Når jeg ser på Python data typer til SQL data typer mapping forneden. Kan jeg se at SQL binary værdig svare til pythons raw værdig, men kan ikke rigtigt finde noget omkring dette.
https://docs.microsoft.com/en-us/sql/advanced-analytics/python/python-libraries-and-data-types?view=sql-server-2017
Avatar billede erikjacobsen Ekspert
11. september 2018 - 10:20 #7
Jeg er ganske enig med dig i #6

Da jeg alligevel har brug for en mssql-server om en måneds tid, fik jeg sat een op og prøvede lidt med Python - både 2 og 3. Det virker ikke.

Python 3 skelner bedre mellem strenge og byte-arrays, men heller der.

Problemet, som jeg så det sidst på aftenen, er at ingen Python-moduler til db adgang implementerer prepared statements rigtigt - kun noget der ligner, som måske bliver kaldt parametriserede statements.

De "rigtige" prepared statements sender en SQL streng med "?" eller lignende afsted til SQL-serveren, sammen med et passende antal værdier ved siden af.

De parametriserede statements opbygger een SQL-streng med værdier sat ind, under hensyntagen til SQL-injection, men har så ikke valgt at tage hensyn til byte-arrays. Og hvis de havde gjort det, så havde de bare lavet det om til en tekststreng.

Men det var sent, og det var mørkt udenfor, så måske mangler jeg bare oplysninger: findes der Python-moduler til databaseadgang, der rent faktisk anvender rigtige prepared statements?
Avatar billede ravelab Praktikant
11. september 2018 - 11:14 #8
I dette tilfælde bruger jeg ikke SQL servers muligheder for at køre med Python kode, men bruger Python koden eksternt i et ETL værktøj for derefter at pushe det tilbage til SQL serveren.

Men har nu besluttet at bruge SQL convert(binary(16),string,2) i final step frem for at holde alt i Python, da du nævnte at det næsten var umuligt at ramme SQL binary formatet i Python.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester