如何使用 Excel VBA 获取长字符串的短哈希?
给予什么
- 输入字符串不超过80个字符
- 有效输入字符为: [0..9] [A_Z] 。 _ /
- 有效输出字符为 [0..9] [AZ] [az](大小写均可)
- 输出哈希值不应超过 12 个字符(越短越好)
- 根本不需要唯一,因为这会导致哈希值太长
到目前为止我做了什么
我想这个答案 https://stackoverflow.com/a/7360012/935614这是一个好的开始,因为它生成 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的测试字符串 http://pastebin.com/raw.php?i=wY3E9pTg.
将它们粘贴到新 Excel 工作簿中的 A 列并执行上面的代码。
Q:如何获得足够短(12 个字符)且足够长以获得一小部分重复项的字符串哈希。
也许其他人会发现这很有用。
我收集了一些不同的函数来在 VBA 中生成字符串的短哈希。
我不将代码归功于我,并且所有来源均被引用。
-
CRC16 https://stackoverflow.com/a/7360012/935614
- 功能:
=CRC16HASH(A1)
有了这个Code https://gist.github.com/anonymous/d24a7a03f7f2a771c0f2
- hash 是一个 4 个字符长的十六进制字符串
- 19行代码
- 4 位长散列 = 6895 行中的 624 次冲突 = 9% 冲突率
-
CRC16 numeric https://stackoverflow.com/a/7359753/935614
- 功能:
=CRC16NUMERIC(A1)
有了这个Code https://gist.github.com/anonymous/52542c13034fe308ac2a
- hash是一个5位长的数字
- 92 行代码
- 5 位长散列 = 6895 行中的 616 次冲突 = 8.9 % 冲突率
-
CRC16 twice https://stackoverflow.com/a/14735118/935614
- 功能:
=CRC16TWICE(A1)
有了这个Code https://gist.github.com/anonymous/c1206b3e17c6b01a7838
- hash 是一个 8 个字符长的十六进制字符串
- hash可以扩展到12/16/20等字符以进一步降低冲突率
- 39行代码
- 8 位长哈希 = 6895 行中 18 次冲突 = 0.23 % 冲突率
-
SHA1 https://stackoverflow.com/a/482150/935614
- 功能:
=SHA1TRUNC(A1)
有了这个Code https://gist.github.com/anonymous/573a875dac68a4af560d
- hash 是一个 40 个字符长的十六进制字符串
- 142 行代码
- 可以被截断
- 4 位数字哈希 = 6895 行中的 726 次冲突 = 10.5 % 冲突率
- 5 位数字哈希 = 6895 行中 51 次冲突 = 0.73 % 冲突率
- 6 位数字哈希 = 6895 行中 0 次冲突 = 0 % 冲突率
-
SHA1 + Base64 https://stackoverflow.com/a/10068932/935614
- 功能:
=BASE64SHA1(A1)
有了这个Code https://gist.github.com/anonymous/a773913ce303c713758d
- hash 是一个 28 个字符长的 unicode 字符串(区分大小写+特殊字符)
- 41 行代码
- 需要 .NET,因为它使用库“Microsoft MSXML”
- 可以被截断
- 4 位数字哈希 = 6895 行中的 36 次冲突 = 0.5 % 冲突率
- 5 位数字哈希 = 6895 行中 0 次冲突 = 0 % 冲突率
Here http://ge.tt/9q1jfos2是我的测试工作簿,其中包含所有示例函数和大量测试字符串。
随意添加自己的功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)