Page 1 sur 1
[Ex] Hash compare
Posté : ven. 17 déc. 2010 12:34
par matwachich
Voila un petit script que j'ai fait à cause d'une gravure qui a planté lors de la vérification. Je me suis retrouvé avec un DVD gravé à 100% mais dont la fiabilité n'était pas sure, et comme les données était sensibles et que je devait les supprimer de mon PC pour libérer de l'espace, j'ai fait ce petit truc tout simple qui compare les Hash de 2 fichiers:
Il suffit de faire glisser les 2 fichiers à comparer sur la fenêtre et la vérification se lance, un appui sur Escape réinitialise la liste des 2 fichiers à comparer si on en a fait glisser qu'un et qu'on se rend compte que c'est pas le bon.
PS: juste une question: j'ai utilisé $CALG_MD2 comme algorithme de hachage, est que c'est le plus rapide?
Re: [Ex] Hash compare
Posté : ven. 17 déc. 2010 13:28
par Colin117
Le problème c'est: est-ce que cela va marcher avec tout les hash ? enfin ça marche qu'avec les ISO le md2 non ?
Re: [Ex] Hash compare
Posté : ven. 17 déc. 2010 13:49
par jchd
Ce n'est surtout pas pour dévaloriser ni minimiser la valeur de ton développement, mais je signale au passage un
petit logiciel bien pratique et open source à celles et ceux qui ne le connaîtraient pas encore. Il doit être automatisable par Autoit sans problème, si besoin.
Re: [Ex] Hash compare
Posté : ven. 17 déc. 2010 14:12
par matwachich
Je savait qu'il devait exister déjà des logiciels qui font la même chose, mais je voulait un truc HYPER simple pour comparer les fichiers gravés à ceux sur le disque dur, pour être sure qu'il sont bien gravés et que je pouvait les supprimer.
Karen's Hasher est plus complet certes, mais il demande beaucoup plus de cliques pour comparer 2 fichiers que mon petit script.
Et puis je n'ai pas télécharger Karen's mais je ne vois (sur le screen du site) aucune commande pour COMPARER 2 fichiers, seulement pour hacher des fichiers, après je pense qu'il faut les comparer à la main (à l'oeil plutôt!

).
@Colin: On peut hacher n'importe quel fichier avec n'importe quel algorithme.
Re: [Ex] Hash compare
Posté : ven. 17 déc. 2010 18:37
par timmalos
J'ai fais quelque tests avec une fonction _sha1 de bas niveau et les resultats sont sans appel:
Pour un fichier de 19 Megas:
C:\Users\tim\Desktop\Usb suite\UDFs\WinAPIEx.au3
> File 1 set.
C:\Users\tim\Desktop\Usb suite\UDFs\WinAPIEx.au3
> File 2 set.
> Starting...
> Hashing File 1...
> Done! (0x534013C96C22B4A29847FC331613152A) in (ms) :5563.91603357579
> Done! (bddb55a52c8529a82f0f5eff74e578551478db2b) in (ms) :12.9753955895685
> Hashing File 2...
> Done! (0x534013C96C22B4A29847FC331613152A) in (ms) :5539.42662850478
> Done! (bddb55a52c8529a82f0f5eff74e578551478db2b) in (ms) :12.9835758871773
> Hash OK!
> =============================================
La 2eme ligne est du sha1 et les resultats sont 463 fois plus rapides avec ma fonction

Je vais d'ailleurs la mettre ci-dessous après t'avoir donné l'eau à la bouche:
► Afficher le texte
Code : Tout sélectionner
Func _Hash_file_SHA1($file)
$hFile = FileOpen($file,16)
If $hFile = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
$Data = FileRead($hFile, 512 * 1024)
FileClose($file)
Local $_SHA1Opcode = '0xC86800005356576A006A006A008D459850E829000000FF7514FF750CFF75088D459850E88A0000006A006A008D459850FF7510E8490000005F5E5BC9C210005589E5538B5D08836314008363180083635C00C70301234567C7430489ABCDEFC74308FEDCBA98C7430C76543210C74310F0E1D2C383636000836364005B5DC210005589E55657FF750CE8850200008B7D088B750C6A0559A58A47FF8647FC8847FF8A47FE8647FD8847FEE2EB5F5E5DC210005589E55356578B5D08837D10007502EB59837B60007506837B640074076A018F4364EB468B4D108B7D0CEB3449518A078B735C8844331CFF435C83431408837B1400750EFF4318837B180075056A018F4364837B5C40750653E813000000475985C97406837B640074C25F5E5B5DC21000C84801005356578B5D086A10598D51FF89D7C1E7020FB6443B1CC1E018898495BCFEFFFF0FB6443B1DC1E010098495BCFEFFFF0FB6443B1EC1E008098495BCFEFFFF0FB6443B1F098495BCFEFFFFE2BD6A105A83FA5073288B8495B0FEFFFF3384959CFEFFFF33849584FEFFFF3384957CFEFFFFD1C0898495BCFEFFFF42EBD38B4D088B318B59048B51088B790C8B41108985B8FEFFFF8365FC00837DFC147D3C89D131F921D931F989F0C1C00501C80385B8FEFFFF8B4DFC03848DBCFEFFFF059979825A5089BDB8FEFFFF89D789D8C1C01E89C289F35EFF45FCEBBE6A148F45FC837DFC287'
$_SHA1Opcode &= 'D3A89D931D131F989F0C1C00501C80385B8FEFFFF8B4DFC03848DBCFEFFFF05A1EBD96E5089BDB8FEFFFF89D789D8C1C01E89C289F35EFF45FCEBC06A288F45FC837DFC3C7D4689D821F85089D021F889D921D109C15809C189F0C1C00501C80385B8FEFFFF8B4DFC03848DBCFEFFFF05DCBC1B8F5089BDB8FEFFFF89D789D8C1C01E89C289F35EFF45FCEBB46A3C8F45FC837DFC507D3A89D931D131F989F0C1C00501C80385B8FEFFFF8B4DFC03848DBCFEFFFF05D6C162CA5089BDB8FEFFFF89D789D8C1C01E89C289F35EFF45FCEBC08B4D088B0101F089018B410401D88941048B410801D08941088B410C01F889410C8B41100385B8FEFFFF89411083615C005F5E5BC9C204005589E55356578B5D08837B6400740431C0EB14837B6000750B53E80F0000006A018F436031C0405F5E5B5DC204005589E553578B5D088B7B5C83FF37762EC6443B1C8047EB06C6443B1C004783FF4072F5897B5C53E8B6FDFFFF8B7B5CEB06C6443B1C004783FF3872F5EB13C6443B1C8047EB06C6443B1C004783FF3872F5897B5C8B4318C1E81825FF0000008843548B4318C1E81025FF0000008843558B4318C1E80825FF0000008843568B431825FF0000008843578B4314C1E81825FF0000008843588B4314C1E81025FF0000008843598B4314C1E80825FF00000088435A8B431425FF00000088435B53E81EFDFFFF5F5B5DC20400'
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($_SHA1Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $_SHA1Opcode)
Local $Input = DllStructCreate("byte[" & BinaryLen($Data) & "]")
DllStructSetData($Input, 1, $Data)
Local $Digest = DllStructCreate("byte[20]")
DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"ptr", DllStructGetPtr($Input), _
"int", BinaryLen($Data), _
"ptr", DllStructGetPtr($Digest), _
"int", 0)
Local $Ret = DllStructGetData($Digest, 1)
$Input = 0
$Digest = 0
$CodeBuffer = 0
$Ret = StringLower(StringRight($Ret, StringLen($Ret) - 2)) ; Supprime le 0x du début et met toutes les lettres au minuscule (S'adapte a la fonction sha1 de PHP, possible de supprimer cette ligne)
Return $Ret
EndFunc
Attention, je n'ai pas dis que Sha1 était plus rapide que MD2, cela dépend de leur implementation uniquement, et ici on utilise une dll de bas niveau ce qui explique la différence enorme de temps

Si tu arrives à trouver l'OpCode de MD2 tu pourras comparer avec le meme algorithme la difference de temps devrait être equitable.
Re: [Ex] Hash compare
Posté : ven. 17 déc. 2010 19:44
par Tlem
Bien, puisque tout le monde s'y met ...
Alors moi je propose deux choix :
1 - L'utilisation du programme en ligne de commande : MD5.exe
2 - L'utilisation d'un script en 'pure AutoIt'.
Sur le matériel dont je dispose (C2D 1.66 Ghz et disque SSD), la création du hash MD5 d'un fichier de 299 Mo a été généré en :
- 1 - Avec MD5.exe en 2134 ms
2 - Pure AutoIt en 5222 ms
Je met en fichier joint les éléments utilisés (en dehors du fichier de 300Mo

)
Le programme MD5.exe est disponible ici :
http://www.fourmilab.ch/md5/
Et la fonction MD5.au3 provient de ce message :
http://www.autoitscript.com/forum/topic ... e__hl__md5
Vous y trouverez d'ailleurs d'autres type de contrôle.
Voilà, il reste plus qu'à faire son choix.
Re: [Ex] Hash compare
Posté : sam. 18 déc. 2010 15:38
par jchd
Attention, je n'ai pas dis que Sha1 était plus rapide que MD2, cela dépend de leur implementation uniquement, et ici on utilise une dll de bas niveau ce qui explique la différence enorme de temps

Si tu arrives à trouver l'OpCode de MD2 tu pourras comparer avec le meme algorithme la difference de temps devrait être equitable.
Attention à ce mode de comparaison : le premier run sur un fichier risque bien de fonctionner en lisant depuis le disque, alors que le second est garanti de ne lire que le cache Windows et/ou buffer disque. Plutôt que s'embêter à vider les caches (ce qui n'est pas trivial) il faut lancer deux runs de suite sur le même fichier avec un même algo et ne chronométrer que le second run.
Sur des fichiers plus gros que les caches (dont on ne connaît pas toujours la taille avec précision et encore moins la méthode d'emploi), il faut même parfois lancer 3, 4 ou plus de fois le même job pour voir les temps se stabiliser à un minimum.
Re: [Ex] Hash compare
Posté : sam. 18 déc. 2010 18:01
par timmalos
En effet, je ne l'ai pas precisé mais c'est bien sur le 2ème essai que j'ai calculé les temps. Je n'ai pas le code sous la main n'etant pas sur ma machine, mais je le deposerai si quelqu'un le veux.
Re: [Ex] Hash compare
Posté : ven. 21 janv. 2011 11:27
par TommyDDR
Histoire de mettre mon grain de sel ^^, vous pouvez réduire votre fonction "_out" à une seul ligne :
Code : Tout sélectionner
Func _out($data)
GUICtrlSetData($out, "> " & $data & @CRLF, 1)
EndFunc
Le paramètre "1", signifie : "Ajoute à la fin de l'ancien".