Dies ist ein Projekt (?), Das aus Erstellen eines Passwortabfragesystems (Clojure Reducer) und einer realistischen Reihe von JALs Passwortverwaltungssystemen stammt. Es ist eine Täuschung der Methode, die mit erreicht werden kann.
Nennen Sie es nicht jetzt oder veraltet.
Bitte teilen Sie uns mit, ob die Liste Auslassungen enthält. Ich werde es hinzufügen.
Ein Datensatz, der überhaupt nicht leuchtet, wird hier hinzugefügt.
os:windows7 Home Premium sp1 cpu:i7-4770T @2.50GHz Python:3.4.1(Anaconda 2.0.1 (64-bit))
Da es sich um Python3 handelt, muss die Zeichenfolge in eine Byte-Zeichenfolge konvertiert werden. Die CPU hat 8 Kerne, aber die Anzahl der Parallelen beträgt 4. Den von mir verwendeten Code finden Sie hier [https://github.com/soyiharu/md5_time_trial].
hash_single.py
import time
import hashlib
import sys
def main():
argv = sys.argv[1:]
if len(argv) != 2:
sys.exit(0)
salt = argv[0]
hash = argv[1]
start = time.time()
for i in range(1000000):
pw = "{0}${1:06d}".format(salt, i).encode("utf-8")
tmp = hashlib.md5(pw).hexdigest()
if hash == tmp:
print("match[{0:06d}]".format(i))
end = time.time()
print("elapsed time:{0}s".format(end - start))
if __name__ == "__main__":
main()
hash_parallel.py
import time
import hashlib
import sys
from multiprocessing import Pool
from itertools import repeat
def calc_hash(arg):
hash, salt, i = arg
tmp = hashlib.md5("{0}${1:06d}".format(salt, i).encode("utf-8")).hexdigest()
return hash == tmp
def main():
argv = sys.argv[1:]
if len(argv) != 2:
sys.exit(0)
salt = argv[0]
hash = argv[1]
start = time.time()
pool = Pool(4)
result = pool.map(calc_hash, zip(repeat(hash), repeat(salt), range(1000000)))
index = result.index(True)
print("match[{0:06d}]".format(index))
end = time.time()
print("elapsed time:{0}s".format(end - start))
if __name__ == "__main__":
main()
Wiederholen Sie dies alle 5 Mal, um die Zeit zu messen.
python hash_single.py hoge 4b364677946ccf79f841114e73ccaf4f
python hash_parallel.py hoge 4b364677946ccf79f841114e73ccaf4f
Erstes Mal | Zweites Mal | Drittes Mal | 4 .. | 5. Mal | durchschnittlich | Standardabweichung | |
---|---|---|---|---|---|---|---|
Einzelversion | 1.724097967 | 1.736099005 | 1.729099035 | 1.733099937 | 1.739099026 | 1.732298994 | 0.005891065 |
Multi-Version | 1.086061954 | 1.098062992 | 1.080061913 | 1.113064051 | 1.085062027 | 1.092462587 | 0.013278723 |
Das Gerät ist Sekunden
Die parallele Ausführungszeit beträgt 63% der nicht parallelen ※Referenz "Rundung des MD5-Hashwerts des 6-stelligen Kennworts" Bei Verwendung von OpenMP betrug das Ausführungsergebnis (parallele Nummer 4) 0,912 Sekunden, obwohl es basierend auf der Kita bis zu 0,70 Sekunden geringfügig geändert wurde. (Quellcode)
Da die Ausführungszeit bei der Parallelisierung nur etwa 63% beträgt, handelt es sich überhaupt um Parallelisierung, aber ich denke, dass Python hart gearbeitet hat, weil ich den Unterschied von etwa 16% zum Fall von c aufgeholt habe. Man kann sagen, dass c nutzlos ist.
Ich habe von der Existenz eines Bytearrays erfahren. Die Python-Zeichenfolge und die Byte-Zeichenfolge können nicht geändert werden, aber das Bytearray kann geändert werden. Auf diese Weise dachte ich, dass es schneller wäre, wenn ich nur den 6-stelligen Zahlenteil neu erstellen würde, ohne jedes Mal die gesamte Byte-Zeichenfolge in der Single-Thread-Version neu zu erstellen, aber es war nur etwa 0,1 Sekunden schneller, nicht so viel wie ich erwartet hatte. tat.
Ich werde die Änderungen veröffentlichen, damit Sie sehen können, was Sie getan haben.
python
from itertools import product
pw = bytearray("{0}${1:06d}".format(salt, 0).encode("utf-8")) #Bytearray vorbereiten
for i, value in enumerate(product(b'0123456789', repeat=6)):
pw[-6:] = value #Ändern Sie nur den Nummernteil
Wenn Sie die Geschwindigkeit verfolgen möchten, vielleicht C / C ++.
Recommended Posts