Você não precisa escrever sua própria função - outros já fizeram isso por você.
Por exemplo, coletei e comparei cinco funções de hash do VBA nessa resposta do stackoverflow
Pessoalmente, eu uso essa função do VBA
- é chamado com
=BASE64SHA1(A1)
no Excel depois que você copiou a macro para um módulo do VBA - requer o .NET, pois usa a biblioteca "Microsoft MSXML" (com ligação tardia)
Public Function BASE64SHA1(ByVal sTextToHash As String)
Dim asc As Object
Dim enc As Object
Dim TextToHash() As Byte
Dim SharedSecretKey() As Byte
Dim bytes() As Byte
Const cutoff As Integer = 5
Set asc = CreateObject("System.Text.UTF8Encoding")
Set enc = CreateObject("System.Security.Cryptography.HMACSHA1")
TextToHash = asc.GetBytes_4(sTextToHash)
SharedSecretKey = asc.GetBytes_4(sTextToHash)
enc.Key = SharedSecretKey
bytes = enc.ComputeHash_2((TextToHash))
BASE64SHA1 = EncodeBase64(bytes)
BASE64SHA1 = Left(BASE64SHA1, cutoff)
Set asc = Nothing
Set enc = Nothing
End Function
Private Function EncodeBase64(ByRef arrData() As Byte) As String
Dim objXML As Object
Dim objNode As Object
Set objXML = CreateObject("MSXML2.DOMDocument")
Set objNode = objXML.createElement("b64")
objNode.DataType = "bin.base64"
objNode.nodeTypedValue = arrData
EncodeBase64 = objNode.text
Set objNode = Nothing
Set objXML = Nothing
End Function
Personalizando o tamanho do hash
- o hash é inicialmente uma cadeia unicode de 28 caracteres (case sensitive + caracteres especiais)
- Você personaliza o tamanho do hash com esta linha:
Const cutoff As Integer = 5
- 4 dígitos hash = 36 colisões em 6895 linhas = 0,5% taxa de colisão
- 5 dígitos hash = 0 colisões em 6895 linhas = 0% taxa de colisão
Também há funções hash ( todas as três funções CRC16 ) que não exigem .NET e não usam bibliotecas externas. Mas o hash é mais longo e produz mais colisões.
Você também pode fazer o download deste exemplo de pasta de trabalho e brincar com todas as 5 implementações de hash. Como você vê, há uma boa comparação na primeira folha