[UDF] HashMap

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
TT22
Membre émérite
Membre émérite
Messages : 1566
Enregistré le : lun. 18 avr. 2011 15:21
Localisation : La Quatrième Dimension
Status : Hors ligne

[UDF] HashMap

#1

Message par TT22 »

Bonsoir à tous, j'ai été amené pour un de mes projets AutoIt à coder un équivalent des HashMap en Java, qui servent à associer des clés (notamment des chaînes de caractères) à des valeurs à l'aide d'une fonction de hachage et d'une table où les valeur sont stockées en fonction de l'empreinte de la clé. En gros c'est comme un tableau où les indices ne sont pas forcément des entiers contigus.
Donc je le poste ici si jamais quelqu'un en a besoin.

Les clés peuvent êtres de trois types (entier, flottant ou chaîne de caractères), sachant qu'une HashMap doit avoir toutes ses clés du même type (pour éviter les conflits).

Voici un petit exemple :
#cs ----------------------------------------------------------------------------

 AutoIt Version : 3.3.12.0
 Auteur:         TT22

 Fonction du Script :
   Exemple d'utilisation de l'UDF HashMap

#ce ;---------------------------------------------------------------------------

#include "HashMap.au3"

; Crée une table avec des clés en chaînes de caractères
$HashMap = _HashMapCreate("String")
$error = @error
If $error Then Exit MsgBox(16, @ScriptName, "Error _HashMapCreate()" & @CRLF & "@error : " & $error)

; On y met des valeurs
_HashMapPut($HashMap, "Key1", "This is my 1st value!")
_HashMapPut($HashMap, "Key2", "This is my 2nd value!")
_HashMapPut($HashMap, "Key1", "This is my 1st value modified!")
_HashMapPut($HashMap, "Key3", 3.1415926535)
_HashMapPut($HashMap, "Key4", 42)

; On en supprime une
_HashMapRemove($HashMap, "Key3")
$error = @error
If $error Then Exit MsgBox(16, @ScriptName, "Error _HashMapRemove()" & @CRLF & "@error : " & $error)

; On les récupères
MsgBox(0, "Key1", _HashMapGet($HashMap, "Key1") & @CRLF & "@error : " & @error)
MsgBox(0, "Key2", _HashMapGet($HashMap, "Key2") & @CRLF & "@error : " & @error)
MsgBox(0, "Key3", _HashMapGet($HashMap, "Key3") & @CRLF & "@error : " & @error) ; Doit retourner une erreur (car supprimée)
MsgBox(0, "Key4", _HashMapGet($HashMap, "Key4") & @CRLF & "@error : " & @error)

; Nombre d'élémentes
MsgBox(0, @ScriptName, "_HashMapSize($HashMap) : " & _HashMapSize($HashMap))

; On essaye de remplir avec plein de valeurs et une table à clé flottantes
$HMDouble = _HashMapCreate("Double", 100)
For $i = 0 To 1000 Step 1 ; Création
   _HashMapPut($HMDouble, $i/1000, $i)
Next
For $i = 0 To 1000 Step 1 ; Vérification
   $v = _HashMapGet($HMDouble, $i/1000)
   If @error Then Exit MsgBox(16, @ScriptName, "Error _HashMapGet()" & @CRLF & "@error : " & @error)
   If $v <> $i Then Exit MsgBox(16, @ScriptName, "Error _HashMapGet() : Wrong value!")
Next
MsgBox(64, @ScriptDir, "Everything works perfectly!")
La documentation :
; #INDEX# ===============================================================================
; Title .........: HashMap
; AutoIt Version : 3.3.12.0
; Language ......: English
; Description ...: Implements an HashMap system (Java like)
; Author(s) .....: TT22
; =======================================================================================

; #CURRENT# =============================================================================
; _HashMapCreate
; _HashMapPut
; _HashMapGet
; _HashMapRemove
; _HashMapGetKeyType
; _HashMapIsValid
; =======================================================================================

; #FUNCTION# ============================================================================
; Name...........: _HashMapCreate
; Description ...: Creates an HashMap
; Syntax.........: _HashMapCreate ( [$KeyType = "String" [, $iMapSize = 100 [, $HashAlg = $CALG_MD5]]] )
; Parameters ....: $KeyType - The type of the keys ("Int32", "Double" or "String")
;                  $iMapSize - Size of the map (at least 2)
;                  $HashAlg - The algorithm to use for hash keys (from <Crypt.au3>)
; Return values .: Success - An HashMap
;                  Error - False
; Author ........: TT22
; Modified.......: 01/12/2016
; =======================================================================================

; #FUNCTION# ============================================================================
; Name...........: _HashMapPut
; Description ...: Store an element into an HashMap
; Syntax.........: _HashMapPut ( ByRef $HashMap, $Key, $Value )
; Parameters ....: $HashMap - The HashMap in which to add the value
;                  $Key - The key (must be in the type of the HashMap keys!)
;                  $Value - The value to store
; Return values .: Success - True
;                  Error - False
; Author ........: TT22
; Modified.......: 01/12/2016
; Related .......: _HashMapGet, _HashMapRemove
; =======================================================================================

; #FUNCTION# ============================================================================
; Name...........: _HashMapGet
; Description ...: Get an element from an HashMap
; Syntax.........: _HashMapGet ( ByRef $HashMap, $Key )
; Parameters ....: $HashMap - The HashMap in which to get the value
;                  $Key - The key (must be in the type of the HashMap keys!)
; Return values .: Success - The value stored at the key
;                  Error - False and set @error to a non zero value
; Author ........: TT22
; Modified.......: 01/12/2016
; Remarks .......: The key is case sensitive!
; Related .......: _HashMapPut, _HashMapRemove
; =======================================================================================

; #FUNCTION# ============================================================================
; Name...........: _HashMapRemove
; Description ...: Remove an element from an HashMap and return it
; Syntax.........: _HashMapRemove ( ByRef $HashMap, $Key )
; Parameters ....: $HashMap - The HashMap in which to remove the value
;                  $Key - The key (must be in the type of the HashMap keys!)
; Return values .: Success - The value stored at the key
;                  Error - False and set @error to a non zero value
; Author ........: TT22
; Modified.......: 01/12/2016
; Remarks .......: The key is case sensitive!
; Related .......: _HashMapPut, _HashMapGet
; =======================================================================================

; #FUNCTION# ============================================================================
; Name...........: _HashMapSize
; Description ...: Return the number of elements in the HashMap
; Syntax.........: _HashMapSize ( ByRef $HashMap )
; Parameters ....: $HashMap - The HashMap where to count
; Return values .: Success - The number of elements
;                  Error - False and set @error to a non zero value
; Author ........: TT22
; Modified.......: 01/12/2016
; =======================================================================================

; #FUNCTION# ============================================================================
; Name...........: _HashMapGetKeyType
; Description ...: Return the key type of an HashMap
; Syntax.........: _HashMapGetKeyType ( ByRef $HashMap )
; Parameters ....: $HashMap - The HashMap we want to get the key type
; Return values .: Success - "Int32", "Double" or "String"
;                  Error - False
; Author ........: TT22
; Modified.......: 01/12/2016
; =======================================================================================

; #FUNCTION# ============================================================================
; Name...........: _HashMapIsValid
; Description ...: Check if an HashMap is valid
; Syntax.........: _HashMapIsValid( ByRef $HashMap)
; Parameters ....: $HashMap - The HashMap to check
; Return values .: Success - True
;                  Error - False
; Author ........: TT22
; Modified.......: 01/12/2016
; =======================================================================================
Et l'UDF :
HashMap.au3
(11.52 Kio) Téléchargé 529 fois
Cordialement,
TT22
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [UDF] HashMap

#2

Message par jchd »

Pour info, l'objet ScriptingDictionary fait cela très bien, ainsi que le variant AutoIt Map disponible dans la beta.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre