Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
Est-ce que ça ressemble (un peu) à une fonction de hashage?
Auteur Message
Répondre en citant
Message Est-ce que ça ressemble (un peu) à une fonction de hashage? 
Bonsoir à tous!

Depuis longtemps je voulais comprendre comment fonctionnent les "hash" au niveau algorithme, et ce soir, je suis pari dans des formules dans excel afin d'essayer de bidouiller un peu la chose Mr. Green

Et puis j'ai fini par un batch, et j'aimerai savoir si ça ressemble au moins un petit peu à du hashage!

hash.bat (celui la qu'il faut éxécuter):
Code:

@echo off


REM <Liste des variables utilisables>
:: %QueryNbChar%
:: %Query%
:: %Replaced%
:: %ReplacedNbChar%
:: %ArgA%
:: %ArgANbChar%
:: %HEXReplaced%
:: %HEXArgA%
:: %HEXArgB%
:: %HASH%
REM </Liste>


REM <Entête>
setlocal EnableDelayedExpansion
color 0A
title ! WTF ^?
REM </Ent>


REM <Entrée de l'utilisateur>
set /p Query=^>
if "%Query%"=="" goto Error
REM </Entrée de l'utilisateur>

REM <Compte le nombre de caractères dans la requête %Query%>
call :CChar "%Query%"
set QueryNbChar=%CCompt%
REM </Compte>


REM <Variables  utilisées dans les boucles>
set /a ReplaceCounter=-1
set Replaced=0
REM </Variables>


:Replace


REM <Incrémente lu compteur (%ReplaceCounter%) afin de renouveller la valeur de la variable %CutQuery% (lettre dans la variable %Query%)>
set /a ReplaceCounter=%ReplaceCounter%+1
set CutQuery=!Query:~%ReplaceCounter%,1!
REM </Incr>


REM <Parse la variable %CutQuery%, subtilisation numérique>
if "%CutQuery%"=="a" set /a CharCode=97
if "%CutQuery%"=="b" set /a CharCode=98
if "%CutQuery%"=="c" set /a CharCode=99
if "%CutQuery%"=="d" set /a CharCode=100
if "%CutQuery%"=="e" set /a CharCode=101
if "%CutQuery%"=="f" set /a CharCode=102
if "%CutQuery%"=="g" set /a CharCode=103
if "%CutQuery%"=="h" set /a CharCode=104
if "%CutQuery%"=="i" set /a CharCode=105
if "%CutQuery%"=="j" set /a CharCode=106
if "%CutQuery%"=="k" set /a CharCode=107
if "%CutQuery%"=="l" set /a CharCode=108
if "%CutQuery%"=="m" set /a CharCode=109
if "%CutQuery%"=="n" set /a CharCode=110
if "%CutQuery%"=="o" set /a CharCode=111
if "%CutQuery%"=="p" set /a CharCode=112
if "%CutQuery%"=="q" set /a CharCode=113
if "%CutQuery%"=="r" set /a CharCode=114
if "%CutQuery%"=="s" set /a CharCode=115
if "%CutQuery%"=="t" set /a CharCode=116
if "%CutQuery%"=="u" set /a CharCode=117
if "%CutQuery%"=="v" set /a CharCode=118
if "%CutQuery%"=="w" set /a CharCode=119
if "%CutQuery%"=="x" set /a CharCode=120
if "%CutQuery%"=="y" set /a CharCode=121
if "%CutQuery%"=="z" set /a CharCode=122
if "%CutQuery%"=="A" set /a CharCode=65
if "%CutQuery%"=="B" set /a CharCode=66
if "%CutQuery%"=="C" set /a CharCode=67
if "%CutQuery%"=="D" set /a CharCode=68
if "%CutQuery%"=="E" set /a CharCode=69
if "%CutQuery%"=="F" set /a CharCode=70
if "%CutQuery%"=="G" set /a CharCode=71
if "%CutQuery%"=="H" set /a CharCode=72
if "%CutQuery%"=="I" set /a CharCode=73
if "%CutQuery%"=="J" set /a CharCode=74
if "%CutQuery%"=="K" set /a CharCode=75
if "%CutQuery%"=="L" set /a CharCode=76
if "%CutQuery%"=="M" set /a CharCode=77
if "%CutQuery%"=="N" set /a CharCode=78
if "%CutQuery%"=="O" set /a CharCode=79
if "%CutQuery%"=="P" set /a CharCode=80
if "%CutQuery%"=="Q" set /a CharCode=81
if "%CutQuery%"=="R" set /a CharCode=82
if "%CutQuery%"=="S" set /a CharCode=83
if "%CutQuery%"=="T" set /a CharCode=84
if "%CutQuery%"=="U" set /a CharCode=85
if "%CutQuery%"=="V" set /a CharCode=86
if "%CutQuery%"=="W" set /a CharCode=87
if "%CutQuery%"=="X" set /a CharCode=88
if "%CutQuery%"=="Y" set /a CharCode=89
if "%CutQuery%"=="Z" set /a CharCode=90
if "%CutQuery%"=="0" set /a CharCode=48
if "%CutQuery%"=="1" set /a CharCode=49
if "%CutQuery%"=="2" set /a CharCode=50
if "%CutQuery%"=="3" set /a CharCode=51
if "%CutQuery%"=="4" set /a CharCode=52
if "%CutQuery%"=="5" set /a CharCode=53
if "%CutQuery%"=="6" set /a CharCode=54
if "%CutQuery%"=="7" set /a CharCode=55
if "%CutQuery%"=="8" set /a CharCode=56
if "%CutQuery%"=="9" set /a CharCode=57
if "%CutQuery%"=="-" set /a CharCode=45
if "%CutQuery%"=="_" set /a CharCode=95
if "%CutQuery%"=="." set /a CharCode=46
if "%CutQuery%"=="@" set /a CharCode=64
REM </Parse>


REM <Renouvelle la valeur de la variable %Replaced%>
set /a Replaced=%Replaced%+%CharCode%
REM </Renouvelle>


REM <Teste si la variable %TempCounter% est égale à la %QueryNbChar%>
set /a TempCounter=%ReplaceCounter%+1
if not "%TempCounter%"=="%QueryNbChar%" goto Replace
REM </Teste>


REM <Ajoute %QueryNbChar% à la variable %Replaced% dans une nouvelle variable %ArgA%>
set /a ArgA=%QueryNbChar%+%Replaced%
REM </Ajoute>


REM <Compte le nombre de caractères dans %ArgA%>
call :CChar "%ArgA%"
set ArgANbChar=%CCompt%
REM </Compte>


REM <Compte le nombre de caractères dans %Replaced%>
call :CChar "%Replaced%"
set ReplacedNbChar=%CCompt%
REM </Compte>


REM <Définition de la variable %ArgB%>
set /a ArgB=(%ArgA%+%Replaced%)*(%ArgANbChar%*%ReplacedNbChar%)
REM </D>


REM <Conversion en hexadécimal des variables>
call tohex.bat %Replaced%
set HEXReplaced=%out%
call tohex.bat %ArgA%
set HEXArgA=%out%
call tohex.bat %ArgB%
set HEXArgB=%out%
set HASH=%HEXReplaced%%HEXArgA%%HEXArgB%
REM </Conversion>


REM <Resultat>
cls
echo.
echo %Query% - %HASH%
echo.
pause
exit
REM </Resultat>

:Error
REM <Message d'erreur, si la variable %Query%, définie par l'utilisateur est invalide>
cls
echo.
echo ^>^>^> Invalid query!
echo.
pause
exit
REM </Message>


:CChar
REM <Fonction qui permet de compter de compter le nombre de caractères dans une chaîne.>
:: Variable pour le compteur
set CCompt=0
:: Requête
set CQuery=%1
:: Parse la requête, afin d'éviter des conflits
set Cquery=%Cquery:"=%
set Cquery=%Cquery:'=%
set Cquery=%Cquery:<=%
set Cquery=%Cquery:>=%
set Cquery=%Cquery:(=%
set Cquery=%Cquery:)=%
set Cquery=%Cquery:]=%
set Cquery=%Cquery:[=%
:: Boucle qui compte le nombre de caractères
:CChar1
set /a CCompt=%CCompt%+1
set TestC=!Cquery:~%CCompt%,1!
if not "%TestC%"=="" goto CChar1
REM </Fonction>


et l'autre qui va avec (a nommer en tohex.bat !!):

Code:
@echo off
set out=
rem needs an argument
if "%1"=="" goto USAGE

set in=%1
rem make sure it's a number
set /a in=%in%
if not "%errorlevel%"=="0" goto ERROR

rem figure out sign by roundabout fashion using -3 % 2 == -1
set /a inplusone=%in% + 1
set /a inminusone=%in% - 1
rem any set /a could potentially error
if not "%errorlevel%"=="0" goto ERROR

set /a inmodtwo=%in% %% 2
if not "%errorlevel%"=="0" goto ERROR
set /a inplusonemodtwo=%inplusone% %% 2
if not "%errorlevel%"=="0" goto ERROR
set /a inminusonemodtwo=%inminusone% %% 2
if not "%errorlevel%"=="0" goto ERROR

rem if N - 1 is positive and n + 1 is negative we're at the boundary
if "%inminusonemodtwo%:%inplusonemodtwo%"=="1:-1" goto TWOSCOMPLEMENT
set twoscomplement=no

set /a plusorminusone=%in% %% 2
if not "%errorlevel%"=="0" goto ERROR
if "%plusorminusone%"=="0" set /a plusorminusone=%inplusone% %% 2
if not "%errorlevel%"=="0" goto ERROR
if "%plusorminusone%"=="-1" set sign=-

rem this is why the two's complement hacking is necessary:
rem on 32-bit machines, for example, 0 - (-2147483648) = (-2147483648)
if "%plusorminusone%"=="-1" set /a in=0 - %in%

if not "%errorlevel%"=="0" goto ERROR

goto LOOP

:TWOSCOMPLEMENT
set twoscomplement=yes
set sign=-
goto LOOP

:LOOP
if "%in%"=="0" goto ENDLOOP

rem use modular arithmetic and integer division to build
rem a string of hex digits
set /a hexit=%in% %% 16
if not "%errorlevel%"=="0" goto ERROR
set /a in=%in% / 16
if not "%errorlevel%"=="0" goto ERROR

rem 0-9 are ok by themselves but A-F require special handling
if "%hexit%"=="10" set hexit=A
if "%hexit%"=="11" set hexit=B
if "%hexit%"=="12" set hexit=C
if "%hexit%"=="13" set hexit=D
if "%hexit%"=="14" set hexit=E
if "%hexit%"=="15" set hexit=F

rem special handling for two's complement
if "%hexit%:%twoscomplement%"=="-8:yes" set hexit=8

set out=%hexit%%out%

goto LOOP
:ENDLOOP

if "%out%"=="" set out=0

echo %out%

goto END

:USAGE
echo USAGE: tohex [decimal number]
goto END

:ERROR
echo ERROR: %errorlevel%
goto END

:END



Le 2ème batch ne vient pas de moi, je l'ai trouvé sur le net, puis modifié en fonction de mes besoins.


Merci!


PS: Oui, je mets plein de commentaires dans mes batch maintenant, parce que je travaille sur plein de projets et j'oublie mes idées et techniques Mort de Rire



MSN
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message Est-ce que ça ressemble (un peu) à une fonction de hashage? 
Up! Aidez moi un peu Smile



MSN
Message Est-ce que ça ressemble (un peu) à une fonction de hashage? 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch