Как получить короткий хэш длинной строки с помощью Excel VBA
Что дано
- Входная строка не длиннее 80 символов
- Допустимые символы ввода: [0..9] [A_Z]. _/
- Допустимые выходные символы: [0..9] [A_Z] [a_z] (можно использовать нижний и верхний регистр)
- Выходной хэш не должен быть длиннее ~ 12 символов (короче еще лучше)
- Не нужно быть уникальным вообще, так как это приведет к слишком длинному хешу
Что я сделал до сих пор
Я подумал, что этот SO-ответ - хорошее начало, поскольку он генерирует 4-значный шестнадцатеричный код (CRC16).
Но 4 цифры были мало. В моем тесте с 400 строками 20% получили дубликаты где-то еще.
Вероятность возникновения столкновения слишком высока.
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
Как воспроизвести
Вы можете скопировать эти 400 тестовых строк из pastebin.
Вставьте их в столбец A в новой книге Excel и выполните приведенный выше код.
Q: Как я могу получить хеш строки, который достаточно короткий (12 символов) и достаточно длинный, чтобы получить небольшой процент дубликатов.