Listen von Tupeln als Input für hashlib.update

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
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Hallo,
ich habe eine Liste von Tupeln die Ganzzahlen enthält, diese soll als Input für hashlib.update dienen, der will bekanntlich aber nur Strings.
Wie löse ich das am besten?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
zizou2981
User
Beiträge: 59
Registriert: Donnerstag 23. Juni 2011, 21:46

wie wäre es mit:

Code: Alles auswählen

 str(liste[0]) , str(liste[1])...
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Ich bin mir nicht sicher ob du das meinst, aber:

Code: Alles auswählen

>>> a
(10, 20, 30, 40)
>>> "".join(str(b) for b in a)
'10203040'
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Verwendbar wäre das, aber nicht unbedingt elegant.
Zum meinem Verwendungszweck:
Ich habe Bilder gegeben deren Daten als RGB-Tupel-Liste vorliegen und ich will die Hashwerte in einem Dictionary ablegen um Duplikate herauszufiltern. Zum. sieht so der naive Ansatz aus.
Wäre also sicher ganz angebracht, wenn die zu hashende Datenmenge nicht noch zus. wachsen würde.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
lunar

@darktrym: Suchst Du dann nicht einfach folgendes?

Code: Alles auswählen

>>> rgbs = [(255,0,0),(255,0,0)]
>>> list(set(rgbs))
[(255, 0, 0)]
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Bin wohl geistig nicht mehr ganz so frisch. Ich denke mir würde eine Lösung wie eine verschachtelte Schleife, bei den ich die einzelnen Tupelwerte in Strings umwandeln und an update übergebe als Einzeiler genügen.

So, ich geh' jetzt Schafe zählen.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du willst also zwei Bilder vergleichen (um duplikate zu finden), die in diesem Format vorliegen?:

Code: Alles auswählen

[(R, G, B, A), (R, G, B, A), …]
Wieso vergleichst du nicht einfach die Listen direkt miteinander? `image_one == image_two`
the more they change the more they stay the same
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dav1d hat geschrieben:Wieso vergleichst du nicht einfach die Listen direkt miteinander? `image_one == image_two`
Weil das unglaublich langsam ist, wenn man eine genügend große Anzahl von Bildern hat, welche man alle paarweise miteinander vergleichen möchte. Wenn man nur die Hashwerte überprüft fällt hingegen fast gar keine Rechenzeit an.

Zum Hashwert an sich: Vielleicht reicht auch ein Umwandeln deiner Liste in ein Tupel, dann hast du die built-in-hash-Funktion zur Verfügung:

Code: Alles auswählen

hash(tuple([(R, G, B, A), (R, G, B, A), …]))
Wenn ich mich richtig erinnere, dann sollte man den so erzeugten Hashwert jedoch nicht abspeichern, da dieser sich von Pythonversion zu Version unterscheiden kann. Vielleicht liege ich aber auch falsch und jemand möge mich korrigieren.
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

EyDu hat geschrieben:Weil das unglaublich langsam ist, wenn man eine genügend große Anzahl von Bildern hat, welche man alle paarweise miteinander vergleichen möchte. Wenn man nur die Hashwerte überprüft fällt hingegen fast gar keine Rechenzeit an.
Stimmt, ich ging von einmaligem vergleichen aus.
the more they change the more they stay the same
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

EyDu hat geschrieben:Wenn ich mich richtig erinnere, dann sollte man den so erzeugten Hashwert jedoch nicht abspeichern, da dieser sich von Pythonversion zu Version unterscheiden kann. Vielleicht liege ich aber auch falsch und jemand möge mich korrigieren.
Der könnte sich auch schon zwischen Interpreter Sessions ändern um (D)DOS Attacken über Hash Kollisionen zu vermeiden.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Wenn alles Gesagte ein Problem darstellt, wie wärs mit einer eigenen Hashfunktion über die RGBA-Werte?

Code: Alles auswählen

hash = lambda t: ''.join(chr(i) for i in t)
Ist zugegeben ein Schnellschuss, vllt. aber mit einigen Anpassungen interpreter- und sessionübergreifend nutzbar.
Antworten