Zeilenweise auslesen und in Schleife Hashen.. klappt voll nicht :(

Code-Stücke können hier veröffentlicht werden.
Antworten
MarkusPy2
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 20:37

Hallo zusammen,

bin ein Anfänger was Python angeht. Stehe nun vor einem kleinen Problem und komme einfach nicht weiter.
Mein Skript soll aus einer TXT Datei Zeilenweise die Wörter auslesen und eine SHa256 Hash daraus bilden. Das ganze möchte ich aber iterativ in einer Schleife. Also ein Hash vom Hash vom Hash....
Es kommt zwar auch zu einer Ausgabe aber da scheint was nicht ganz zu Funktionieren. Bitte um Hilfe ! Dankeschön ;)

Code: Alles auswählen

#!usr/bin/python

import hashlib

with open("test.txt","r") as f:
    for line in f.readlines():
        line = line.rstrip("\n")
	m = hashlib.sha256(line)
for x in range (0 , 4000):
        ss = (m.hexdigest())
	m = hashlib.sha256(ss)
	print(m.hexdigest())
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also zuerstmal liest du keine Woerter. Du liest Zeilen. Da stimmt also schon was nicht zwischen deiner Aufgabenbeschreibung, und deiner Implementierung. Was ist nun richtig?

Und was sonst glaubst du geht nicht? Dein iteratives gehashe funktioniert doch. Ob es sinnvoll ist steht auf einem anderen Blatt, aber wenn dein Lehrer dir die Aufgabe gegeben hat...
MarkusPy2
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 20:37

Danke für die schnelle Antwort. Natürlich lese ich Zeile für Zeile und möchte für jede Zeile den jeweiligen SHA256 Hash erneut iterativ Hashen. Wenn ich die Ausgabe betrachte, dann passen die Hashes aber nicht richtig. Ich glaube der Code nimmt nur die erste Zeile und da wird irgendwas vertauscht. Wenn ich z.B. "test" als erste Zeile habe dann passt der erste Hash als Ausgabe auch. Beim zweiten Hash stimmt die Ausgabe nicht mehr. Hab es mit einem Online Hasher getestet. Da passt was nicht und ich finde nicht den Fehler. Danke!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe immer noch nicht, was du tun willst. Kann es sein, dass du nach jeder Zeile den hash bilden willst mit dem hash der Zeile davor? Wie lautet denn der genaue Wortlaut deiner Aufgabe?
MarkusPy2
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 20:37

ICh befürchte ja genau das tut das Script. Die Aufgabe ist aus der ersten gelesenen Zeile eine Hash bilden. Aus diesem SHA256 soll wieder ein neuer SHA256 gebildet werden. Und das ganze solange wie die Schleife läuft. Danach soll die zweite Zeile gelesen werden und das spiel beginnt von vorne. Nur das klappt nicht! Hab mich vielleicht nicht so gut ausgedrückt oder das Problem richtig erklärt. Sorry !
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MarkusPy2: „das ganze solange wie die Schleife läuft“ macht keinen Sinn, denn die Schleife läuft so lange wie Zeilen in der Datei sind. Wenn die Schleife dann am Ende ist, ist die zweite Zeile ja bereits lange gelesen und verarbeitet. Oder ist die zweite Schleife gemeint und in Deinem Beispiel falsch eingerückt?

Das Problem ist es das Problem exakt zu beschreiben. Wenn Du das nicht kannst, können wir nur raten, und der Rechner macht nur exakt das was Du sagst. Nicht das was Du eigentlich meinst. Rechner sind saudumm, denen muss man das wirklich genau so sagen wie sie es tun sollen, und nicht nur ungefähr. Diese Mistgeräte denken kein Stück mit. :-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
MarkusPy2
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 20:37

Hatte bisher nicht so viel mit Programmierung zu tun. Kann das wahrscheinlich nicht so gut erklären. In der zweiten ,,for x in range..,, Schleife soll die erste gelesene Zeile den Hashwert immer neu Hashen. Z.B ich habe den SHA256 von test.

9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 <- erste Hashdurchgang. Nun soll dieser String erneut mit SHA256 gehashed werden. Und das ganze halt solange ich es in der zweiten Schleife bestimmte. Das klappt nur halt nicht.Danke
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MarkusPy2: Die zweite ``for``-Schleife in Deinem Code wird aber erst abgearbeitet nach dem die erste Schleife über alle Zeilen gelaufen ist. Du musst das schon so einrücken das der Rechner weiss, dass diese zweite Schleife innerhalb der Ersten und nicht nach der Ersten ausgeführt werden soll. Wie gesagt, der dumme Rechner macht exakt das was man ihm sagt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
MarkusPy2
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 20:37

@__blackjack__ Jetzt klapptes :) War von mir nicht richtig eingerückt, so wie du es erkannt hast. Vielen dank :)
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MarkusPy2: Noch ein paar Anmerkungen zu Deinem Quelltext:

Namen wie `f`, `m`, `x`, und `ss` sind nicht gut. Ein Name soll dem Leser vermitteln was der Wert bedeutet. Ein- oder zweibuchstabige Namen oder kryptische Abkürzungen tun das nicht, und machen Code schwerer verständlich. Was dann eher zu Fehlern führt wenn das Programm vom fremden Leser interpretiert werden soll. Wobei man selbst auch ein fremder Leser ist, wenn man sich eigenen Code nach ein paar Monaten wieder anschaut.

`readlines()` liest alle Zeilen unnötigerweise auf einmal in den Speicher. Man kann an der Stelle einfach über das Dateiobjekt iterieren.

Wenn man irgendwo syntaktisch einen Namen angeben muss, der im Code dann aber nicht verwendet wird, hat sich dafür der Name `_` oder `__` etabliert. Dann weiss der Leser gleich das dieser Name/Wert absichtlich nicht verwendet wird, und das es kein Versehen oder noch unfertiger Code ist. Manchmal will man trotzdem einen lokalen Namen angeben, damit der Leser weiss *was* da nicht verwendet wird — dafür wird konventionell ein führender Unterstrich vor dem unbenutzten Namen verwendet.

Dein Code berechnet einen Hash einmal vor der Schleife, und dann 4.000 mal in der Schleife. Das kann man vereinfachen zu 4.001 mal in der Schleife.

Du verwendest offensichtlich Python 2, aber da sind Klammern bei der ``print``-Anweisung als wenn das eine Funktion wäre. Entweder sollte man die Anweisung auch wie eine Anweisung schreiben, oder sie durch den entsprechenden `__future__`-Import tatsächlich zu einer Funktion machen.

Ungetestet:

Code: Alles auswählen

#!usr/bin/env python
from __future__ import absolute_import, division, print_function
from hashlib import sha256


def main():
    with open('test.txt', 'r') as lines:
        for line in lines:
            hashed = line.rstrip('\n')
            for _ in range(0, 4001):
                hashed = sha256(hashed).hexdigest()
                print(hashed)


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten