(3) 32-Zeichen-Hex-Hashes zu einem einzigen eindeutigen 32-Zeichen-Hash kombinieren?
Frage
Ich habe (3) MD5-Summen, die ich zu einem einzigen Hash kombinieren muss.Der neue Hash sollte 32 Zeichen lang sein, unterscheidet jedoch zwischen Groß- und Kleinschreibung und kann aus einem beliebigen Buchstaben oder einer beliebigen Zahl bestehen.Was ist der beste Weg, dies in Python zu tun?
Lösung
Ich würde damit beginnen, die MD5-Hashes zu einem einzigen Hash zu kombinieren.Sie können SHA256 verwenden, da es am Ende mehr Bytes enthält:
>>> import hashlib
>>> combined = hashlib.sha256()
>>> combined.update(hashlib.md5('test1').digest())
>>> combined.update(hashlib.md5('test2').digest())
>>> combined.update(hashlib.md5('test3').digest())
Dann können Sie es mit base64 mit Buchstaben, Zahlen und einigen zusätzlichen Symbolen kodieren:
>>> import base64
>>> base64.b64encode(combined.digest())
'PeFC3irNFx8fuzwjAz+fE/up9cz6xujs2Z06IH2GdUM='
Wenn Sie nur 32 Zeichen lang sein möchten, schneiden Sie die letzten Bits ab:
>>> base64.b64encode(combined.digest())[:32]
'PeFC3irNFx8fuzwjAz+fE/up9cz6xujs'
Dies kann enthalten +
Und /
zusätzlich zu Buchstaben und Zahlen, wie Ihr OP vorschlägt.Wenn Sie sie ersetzen möchten, können Sie den zweiten Parameter für b64encode verwenden:
>>> base64.b64encode(combined.digest(), altchars="AA")[:32]
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujs'
Andere Tipps
Der einfachste Weg wäre, die 3 Summen in eine einzige 96-Zeichen-Zeichenfolge zu kombinieren und einen MD5-Hash darauf auszuführen.
Nur für ein anderer Weg, mit "Charakteren", um einen Unicode-Codepoint zu bedeuten, hier ist, was ich mitgekommen bin, einschließlich meines Bumpelns: generasacodicetagpre.
Ich hätte wahrscheinlich 13 Bits pro Charakter, um Interpunktion zu vermeiden, aber ich wollte die Zeit nicht investieren, da Sie sowieso nicht um die Reversibilität kümmerten.
[später] Nein, musste nicht: generasacodicetagpre.