hashlib md5 - Verschiedene hashes bei requests content

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
dev01
User
Beiträge: 1
Registriert: Donnerstag 28. November 2024, 11:57

Hallo zusammen,

Habe ein sehr merkwürdiges verhalten bei der hashlib library in Verbindung mit md5 hashes festgestellt -> Python 3.11.9

Es werden über meine Applikation / API - URLs übertragen. Hinter den URLs befinden sich Assets (Video, Bilder oder PDFs) die von mir runtergeladen werden müssen.
Anhand des md5 hashes des Asset Byte Objektes, wird ermittelt ob es sich hierbei um ein neues oder bereits existierendes Asset handelt. Existiert dieser md5 hash bereits in der
DB wird eine Referenz für den Shop erstellt. Andernfalls wird das Asset als neu an den Shop übertragen. So die vereinfachte Version des Projektes.

Per API Request können bis zu 10000 URLs übertragen werden.
Jetzt ist mit bei den Tests aufgefallen, dass immer mal wieder Assets als neu übertragen werden, obwohl diese bereits existieren müssten.

Hier mal ein vereinfachter Code Schnipsel, mit dem ich den Fehler eingrenzen konnte

Code: Alles auswählen

def get_md5_hash(url):
    asset_md5_hash = hashlib.md5()
    r = requests.get(url, allow_redirects=True, timeout=5, stream=True)
    try:
        r.raise_for_status()
    except Exception as error:
        print(f"an requests get error occurred, error desc: '{error}'")
    else:
        r.raw.decode_content = True
        try:
            for line in r.iter_content(chunk_size=1024):
                if line:
                    asset_md5_hash.update(line)
        except Exception as error:
            print(f"could not read bytes object, {error}")
        else:
            print(f"md5 hash: {asset_md5_hash.hexdigest()}")
Wenn ich diese Funktion in einem for loop 100 mal ausführen lasse, bekomme ich 98 mal den hash „8c702e1eda4d55f4b11d1eabf7738a0e“ und 2 mal „46651ab690a01143cbb5279eabf0909a“

Code: Alles auswählen

md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
[…]
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 46651ab690a01143cbb5279eabf0909a
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 46651ab690a01143cbb5279eabf0909a
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
md5 hash: 8c702e1eda4d55f4b11d1eabf7738a0e
[…]
Wie kann das sein?
Sieht Ihr eine Möglichkeit, für einen schnelle Workaround?

Vielen Dank für eure hilfe
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablen initialisiert man dann, wenn man sie braucht, nicht 9 Zeilen davor. iter_content liefert keine Zeilen, sondern Brocken.
Offensichtlich liefert der Server nicht jedesmal die selben Daten. Also erster Schritt wäre es also, die tatsächlichen Daten zu speichern und zu vergleichen.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der Name der Funktion ist ein bisschen irreführend weil die gar nicht zurück gibt, sondern nur Kram ausgibt. Und die sollte auch die Ausnahmen nicht behandeln, denn dann bekommt der Aufrufer davon ja gar nichts mit.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten