Chaîne de hachage VBA

Comment puis-je obtenir un court de hachage d'une longue chaîne à l'aide de VBA Excel

Ce qui est donné

  • Chaîne d'entrée n'est pas plus de 80 caractères
  • D'entrée valide caractères sont les suivants: [0..9] [A_Z] . _ /
  • Valide sortie caractères [0..9] [A_Z] [a_z] (en minuscules et en majuscules peuvent être utilisés)
  • La sortie de hachage ne devrait pas être de plus de ~12 caractères (plus court, c'est encore mieux)
  • Pas besoin d'être unique à tous car cela entraîne un trop long de hachage

Ce que j'ai fait jusqu'à présent

J'ai pensé cette SORTE de réponse est un bon début, car il génère un code de 4 chiffres Code Hexadécimal (CRC16).

Mais 4 chiffres étaient à peu. Dans mon test, avec plus de 400 chaînes de 20% ont obtenu un double quelque part d'autre.
La chance de générer une collision est trop élevé.

Sub tester()
    For i = 2 To 433
        Cells(i, 2) = CRC16(Cells(i, 1))
    Next i
End Sub


Function CRC16(txt As String)
Dim x As Long
Dim mask, i, j, nC, Crc As Integer
Dim c As String

Crc = &HFFFF

For nC = 1 To Len(txt)
    j = Val("&H" + Mid(txt, nC, 2))
    Crc = Crc Xor j
    For j = 1 To 8
        mask = 0
        If Crc / 2 <> Int(Crc / 2) Then mask = &HA001
        Crc = Int(Crc / 2) And &H7FFF: Crc = Crc Xor mask
    Next j
Next nC

CRC16 = Hex$(Crc)
End Function

Comment reproduire

Vous pouvez copier ces 400 test de chaînes à partir de pastebin.
Coller Une colonne dans un nouveau classeur Excel et d'exécuter le code ci-dessus.

Q: Comment puis-je obtenir une chaîne de hachage qui est assez courte (12 caractères) et assez long pour obtenir un petit pourcentage de doublons.

source d'informationauteur nixda