Die Frage ist: zu welchem Zweck? Nur um zu belegen, dass das oben bereits beschriebene System tatsächlich schnell genug ist? Man würde nicht einmal die 30 Sekunden damit nachweisen. Nicht einmal 30 Minuten. Du hast eine grundsätzliche Verzögerung hier drin, alleine dadurch, dass der Beitrag von einer Person geschrieben werden muss, der neue Beitrag von der anderen Person wahrgenommen werden muss, anschließend von dieser Person gelesen werden muss, die nötigen Daten dem Programm zufüttern muss, das Ergebnis der Ausgabe möglichst zeitnah feststellen und schließlich auch noch das Ergebnis der posten. Dies kann von wenigen Minuten bis zu mehreren Stunden dauern. Und nichts davon hat auch nur im Ansatz genug Aussagekraft, dass es irgendetwas bringt, als Stunk zu machen. Das ist der springende Punkt - das hüpfende Komma. Es ist einfach nur eine sinnlose Zeitverschwendung, da es nicht das Geringste aussagt. Und dazu sind auch 30 Sekunden schon zu schade, wenn der Hash überhaupt mit zwei Worten der wordlist.txt gebildet werden kann.
MD5 Hasher optimieren | 0xf Level 20
-
Trojan -
6. Oktober 2015 um 15:09 -
Erledigt
-
-
Die Sache ist eigentlich ganz einfach:
Zeig das deine Behauptungen korrekt sind.
Zeig allen das ich keine Ahnung habe.
Poste einfach dein Skript, welches deutlich besser performt als meines (muss nicht mal die 30s schaffen) und mach aus deinen Aussagen Fakten.Die Sache ist nämlich sehr einseitig wenn nur einer liefert.
-
30s? Das interessiert mich jetzt aber auch.
-
Wenn du AutoIt dafür benutzen möchtest (was nicht die bevorzugte "Sprache" für solche Rechenaufgaben ist), dann benutze doch die Maschine-Code Version von MD5 (Main-Forum).
-
Bei meinen Tests war die Machine-Code-Version langsamer als die _CryptHashData().
Wirklich schnell wird es erst mit Spezialtools wie z.B. HashCat. -
Ohh ok.. hätte ich jetzt nicht gedacht.
Und mal anstatt die CryptHashData Function die andere probiert?
(advapi32\MD5Init | advapi32\MD5Update | advapi32\MD5Final) -
Auch wenn ich nicht wirklich mitreden kann, finde ich es dennoch interessant wie hier drüber diskutiert wird und ob noch weitere Lösungen oder ähnliches gefunden werden!
-
Kann mal jemand mit _CryptHashData() benchmarken? (vlt. so 1k - 10k Aufrufe)
AutoIt
Alles anzeigenMsgBox(0, "", _MD5("test")) MsgBox(0, "", _MD5("Hello World")) Func _MD5($string) Static Local $hDLL = DllOpen("advapi32.dll") Static Local $MD5_CTX = DllStructCreate("dword i[2];dword buf[4];ubyte in[64];ubyte digest[16]") DllCall($hDLL, "none", "MD5Init", "ptr", DllStructGetPtr($MD5_CTX)) DllCall($hDLL, "none", "MD5Update", "ptr", DllStructGetPtr($MD5_CTX), "str", $string, "dword", StringLen($string)) DllCall($hDLL, "none", "MD5Final", "ptr", DllStructGetPtr($MD5_CTX)) return Hex(DllStructGetData($MD5_CTX, "digest")) EndFunc
-
Ist bei mir die bisher schnellste MD5-Implementierung.
Auch schneller als das bisherige inkrementelle hashen.Wenn ich Zeit finde schau ich noch mal ob ich es noch inkrementell implementiert bekomme.
Edit: Ok konnte es jetzt noch inkrementell implementieren.
Bei Gelegenheit bau ich das so in mein Skript ein.
Hier das verwendete Skript zum Performancevergleich:AutoIt
Alles anzeigen#include <Crypt.au3> #include <Array.au3> $N = 20000 $s_Text = "aalaahs" _Crypt_Startup() $iT = TimerInit() For $i = 1 To $N $s_Hash = _Crypt_HashData($s_Text, $CALG_MD5) Next $iT = TimerDiff($iT) ConsoleWrite(StringFormat("% 30s: %8.3f ms\n", "_Crypt_HashData", $iT / $N)) $iT = TimerInit() ; Anfang hashen $h_HashFirst = DllCall($__g_aCryptInternalData[1], "bool", "CryptCreateHash", "handle", $__g_aCryptInternalData[2], "uint", $CALG_MD5, "ptr", 0, "dword", 0, "handle*", 0)[5] $hBuff = DllStructCreate("byte[" & BinaryLen("aal") & "]") DllStructSetData($hBuff, 1, "aal") DllCall($__g_aCryptInternalData[1], "bool", "CryptHashData", "handle", $h_HashFirst, "struct*", $hBuff, "dword", DllStructGetSize($hBuff), "dword", $CRYPT_USERDATA) Global $h_OutBuf = DllStructCreate("byte[16]"), $d_OutBufSize = DllStructGetSize($h_OutBuf) For $i = 1 To $N $h_HashSecond = DllCall($__g_aCryptInternalData[1], "bool", "CryptDuplicateHash", "handle", $h_HashFirst, "DWORD", Null, "DWORD", 0, "handle*", 0)[4] $hBuff = DllStructCreate("byte[" & BinaryLen("aahs") & "]") DllStructSetData($hBuff, 1, "aahs") DllCall($__g_aCryptInternalData[1], "bool", "CryptHashData", "handle", $h_HashSecond, "struct*", $hBuff, "dword", DllStructGetSize($hBuff), "dword", $CRYPT_USERDATA) DllCall($__g_aCryptInternalData[1], "bool", "CryptGetHashParam", "handle", $h_HashSecond, "dword", $HP_HASHVAL, "struct*", $h_OutBuf, "dword*", $d_OutBufSize, "dword", 0) $vReturn = DllStructGetData($h_OutBuf, 1) DllCall($__g_aCryptInternalData[1], "bool", "CryptDestroyHash", "handle", $h_HashSecond) Next DllCall($__g_aCryptInternalData[1], "bool", "CryptDestroyHash", "handle", $h_HashFirst) $iT = TimerDiff($iT) ConsoleWrite(StringFormat("% 30s: %8.3f ms\n", "crypt-api manuell", $iT / $N)) $iT = TimerInit() For $i = 1 To $N $s_Hash = _MD5($s_Text) Next $iT = TimerDiff($iT) ConsoleWrite(StringFormat("% 30s: %8.3f ms\n", "_MD5", $iT / $N)) $iT = TimerInit() $s_Word1 = "aal" $s_Word2 = "aahs" Global $tag_MD5_CTX = "dword i[2];dword buf[4];ubyte in[64];ubyte digest[16]" Global $h_dll_advapi32 = DllOpen("advapi32.dll") Global $strct_CTX_1 = DllStructCreate($tag_MD5_CTX) Global $strct_CTX_2 = DllStructCreate($tag_MD5_CTX) Global $d_CTX_Size = DllStructGetSize($strct_CTX_1) Global $ptr_CTX_1 = DllStructGetPtr($strct_CTX_1) Global $ptr_CTX_2 = DllStructGetPtr($strct_CTX_2) ; ersten Teil hashen: DllCall($h_dll_advapi32, "none", "MD5Init", "ptr", $ptr_CTX_1) DllCall($h_dll_advapi32, "none", "MD5Update", "ptr", $ptr_CTX_1, "str", $s_Word1, "dword", StringLen($s_Word1)) Global $bin_Data_1 = DllStructGetData(DllStructCreate("byte[" & $d_CTX_Size & "]", $ptr_CTX_1), 1) For $i = 1 To $N ; hash kopieren DllStructSetData(DllStructCreate("byte[" & $d_CTX_Size & "]", $ptr_CTX_2), 1, $bin_Data_1) DllCall($h_dll_advapi32, "none", "MD5Update", "ptr", $ptr_CTX_2, "str", $s_Word2, "dword", StringLen($s_Word2)) DllCall($h_dll_advapi32, "none", "MD5Final", "ptr", $ptr_CTX_2) $s_Hash = DllStructGetData($strct_CTX_2, "digest") Next DllClose($h_dll_advapi32) $iT = TimerDiff($iT) ConsoleWrite(StringFormat("% 30s: %8.3f ms\n", "advapi inkrementell", $iT / $N)) Func _MD5($string) Static Local $hDLL = DllOpen("advapi32.dll") Static Local $MD5_CTX = DllStructCreate("dword i[2];dword buf[4];ubyte in[64];ubyte digest[16]") DllCall($hDLL, "none", "MD5Init", "ptr", DllStructGetPtr($MD5_CTX)) DllCall($hDLL, "none", "MD5Update", "ptr", DllStructGetPtr($MD5_CTX), "str", $string, "dword", StringLen($string)) DllCall($hDLL, "none", "MD5Final", "ptr", DllStructGetPtr($MD5_CTX)) Return Hex(DllStructGetData($MD5_CTX, "digest")) EndFunc ;==>_MD5
-
Kannst du die Ergebnisse dazu posten? Habe AutoIt hier zzt. nicht installiert.
-
-
Joa, ist ein bisschen was =)
-
Hab jetzt diese Methode in mein Skript eingebaut.
Auf meinem alten i5 macht das Skript knapp 65.000 Hashes pro Sekunde.
Das ist zwar noch ein Stückchen von den Millionen/s von Tools wie z.B. HashCat entfernt aber für AutoIt ganz gut denke ich. -