Hash è un termine inglese (to hash = sminuzzare) che designa una cosa fatta a fettine.
Nel linguaggio matematico e informatico, l’hash è una funzione che mappa una stringa di lunghezza arbitraria in una stringa di lunghezza minore. Esistono numerosi algoritmi che realizzano funzioni hash con particolari proprietà che dipendono dall’applicazione.
Proponiamo qui oggi una funzioncina semplice e leggera per ricavare da una stringa una sua rappresentazione “hashata”. In particolare secondo l’algoritmo “hash4”
L’algoritmo utilizzato non è invertibile, ossia non è possibile ricostruire la stringa originale a partire dalla stringa che viene restituita in output (è quindi una funzione unidirezionale); uno degli utilizzi potrebbe essere rappresentato in crittografia per verificare l’integrità del messaggio originale (si confrontano gli hash di due stringhe, se coincidono allora rappresentano lo stesso oggetto). Un utilizzo più semplice è costituito dall’assegnazione a un utente di un codice personale per identificarlo in un database.
Generalmente il prodotto di una codifica hash è una sequenza di codici esadecimali.
La funzione VBA proposta è solo uno tra i tanti esempi facilmente reperibili.
Function strcode(s As String, Optional reduce As Boolean = False) As String
'costruisce un hash4 della stringa in argomento
'se esiste spazio, spezza la stringa in tokens e costruisce l'hash4 dei primi due tokens
Dim v As Variant, u As Byte, i As Integer
Dim t As String
If InStr(s, " ") = 0 Then s = s & " "
v = Split(s, " ")
u = UBound(v): If u > 1 Then u = 1
For i = 0 To u
strcode = strcode & hash4(CStr(v(i)))
Next
If reduce Then
For i = 1 To Len(strcode) Step 2
t = t & Chr("&H" & Mid(strcode, i, 2))
Next
strcode = t
End If
End Function
Private Function hash4(s As String)
Dim x As Long
Dim mask As Integer, i As Integer, j As Integer
Dim crc As Integer
crc = -1 '&HFFFF
For i = 1 To Len(s)
crc = crc Xor Asc(Mid(s, i, 1))
For j = 1 To 8
mask = 0
If crc / 2 <> Int(crc / 2) Then mask = &HA001
crc = (Int(crc / 2) And &H7FFF) Xor mask
Next j
Next i
hash4 = String(4 - Len(Hex(crc)), "0") & Hex(crc)
End Function
L’utilizzo è piuttosto semplice: basta copiare e incollare entrambe le routines in un modulo e chiamare la sub che genera il codice (“strcode”) passando in argomento la stringa da codificare. Questa versione genera un codice hash4 per le prime due parole della stringa originale (le parole sono separate da uno spazio). La funzione distingue tra maiuscole e minuscole.
Opzionalmente si può specificare il valore True o False per il parametro Reduce, che è False per impostazione predefinita. Se True, la stringa codificata viene ulteriormente compattata.
Esempio:
strcode(“Excel VBA my love”) –> “0C2A4061”
strcode(“Excel Vba my love”) –> “0C2A5879”
Il cuore è la funzione hash4 che se resa non Private può benissimo operare in modo indipendente (si chiama hash4 perchè restituisce un valore esadecimale di 4 byte). Infatti nella versione a due parole proposta viene effettuata una codifica hash4 separata e poi i due tokens (pezzi) vengono riuniti insieme per produrre il risultato finale.
› Convertire una stringa in codice hash4