Hashlib und Listenverarbeitung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tothstar
User
Beiträge: 2
Registriert: Mittwoch 5. Februar 2014, 21:01

Hallo zusammen, bin gerade dabei mich in Python3 einzuarbeiten und habe mit der Hashlib experimentiert. Nun habe ich folgende simplen Testcode erstellt:

Code: Alles auswählen

#!/usr/bin/python3
import hashlib
m = hashlib.md5()
x = 0
liste = ["hans", "meier", "schulze" ,"schmidt"]

for i in range(len(liste)):
	print (liste[i])
	liste[i].encode("utf-8")
	m.update(liste[i])
	print (m.hexdigest())
In Python2 wid der Code ohne Anstand ausgeführt, in Python3 jedoch mit folgender Meldung quittiert:

TypeError: Unicode-objects must be encoded before hashing

So nun habe ich versucht die listen zu "encoden" dies schlug aber ebenfalls fehl, da die Liste nicht "encodet" werden kann. Hat jemand eine Idee wie ich dies nun realisieren kann?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

1) Das hier tut nicht, was du glaubst, dass es tut:

Code: Alles auswählen

	liste[i].encode("utf-8")
Wenn man diesen Code auf Deutsch übersetzt kommt heraus: Nimm den String in liste, erzeuge davon eine utf-8 kodierte Version, und wirf diese anschließend weg. Tatsächlich sind Strings (und auch unicode Objekte) in Python unveränderbar.

2) Das hier ist das klassische Python-Antipattern:

Code: Alles auswählen

for i in range(len(liste)):
    ...liste[i]...
Statt dessen solltest du direkt über die Elemente der Liste iterieren:

Code: Alles auswählen

for elem in liste:
    ...elem...
oder, wenn du den Index jedes Elements zusätzlich brauchst:

Code: Alles auswählen

for i, elem in enumerate(liste):
    ...elem...
    ...liste[i]...
3) In Python 2 sind str Objekte str Objekte und unicode Objekte sind unicode Objekte. In Python 3 ist beide dasselbe und heißt str, und der Name unicode wird nicht mehr verwendet. Nun möchte hashlib.hash.update() aber kein unicode sehen, sondern byte-Buffer, was auch in der Dokumentation steht.

Wenn man das alles beherzigt, sollte ungefähr sowas herauskommen:

Code: Alles auswählen

#!/usr/bin/python3
import hashlib
m = hashlib.md5()
liste = ["hans", "meier", "schulze", "schmidt"]
    
for elem in liste:
        print(elem)
        elem = elem.encode("utf-8")
        m.update(bytes(elem))
        print(m.hexdigest())
Ergebnis:

Code: Alles auswählen

hans
f2a0ffe83ec8d44f2be4b624b0f47dde
meier
07fe44f69a4a7659fb0c6b697c7a81dd
schulze
5d7447524aac4be48c4491f5d21bd3e3
schmidt
e69816ae7b27b702014ef6b6993ad45f
In specifications, Murphy's Law supersedes Ohm's.
tothstar
User
Beiträge: 2
Registriert: Mittwoch 5. Februar 2014, 21:01

Ich danke dir für die tolle Ausführliche Anleitung, das hat mir die Augen geöffnet ;-) Danke.
Antworten