VBA-Hash-String
Wie erhalte ich mit Excel VBA einen kurzen Hash einer langen Zeichenfolge?
Was ist gegeben
Die Eingabezeichenfolge darf nicht länger als 80 Zeichen seinGültige Eingabezeichen sind: [0..9] [A_Z]. _ /Gültige Ausgabezeichen sind [0..9] [A_Z] [a_z](Klein- und Großbuchstaben können verwendet werden)Der Ausgabe-Hash sollte nicht länger als ~ 12 Zeichen sein (kürzer ist noch besser)Sie müssen überhaupt nicht eindeutig sein, da dies zu einem zu langen Hash führtWas ich bisher gemacht habe
ich dachtediese SO Antwort ist ein guter Anfang, da ein 4-stelliger Hex-Code (CRC16) generiert wird.
Aber 4 Ziffern waren zu wenig. In meinem Test mit 400 Saiten haben 20% ein Duplikat woanders bekommen.
Die Wahrscheinlichkeit, eine Kollision zu erzeugen, ist zu hoch.
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
Wie reproduzieren
Sie können diese 400 kopierenTeststrings aus Pastebin.
Fügen Sie sie in Spalte A einer neuen Excel-Arbeitsmappe ein und führen Sie den obigen Code aus.
Q: Wie erhalte ich einen String-Hash, der kurz genug (12 Zeichen) und lang genug ist, um einen kleinen Prozentsatz von Duplikaten zu erhalten?