当前位置:  开发笔记 > 编程语言 > 正文

为什么此函数生成的哈希码不是唯一的?

如何解决《为什么此函数生成的哈希码不是唯一的?》经验,为你挑选了2个好方法。

我正在测试我从谷歌搜索获得的VB函数.我打算用它来生成哈希码以进行快速字符串比较.但是,有时两个不同的字符串具有相同的哈希码.例如,这些字符串

"122Gen 1堆大小(.NET CLR内存w3wp):mccsmtpteweb025.20833333333333E-02"

"122Gen 2堆大小(.NET CLR内存w3wp):mccsmtpteweb015.20833333333333E-02"

具有相同的哈希码237117279.

请告诉我: - 这个功能有什么问题? - 我该如何解决?

谢谢

马丁


Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal bytes As Long)

Private Function HashCode(Key As String) As Long
  On Error GoTo ErrorGoTo

  Dim lastEl As Long, i As Long
  ' copy ansi codes into an array of long'
  lastEl = (Len(Key) - 1) \ 4
  ReDim codes(lastEl) As Long
  ' this also converts from Unicode to ANSI'
  CopyMemory codes(0), ByVal Key, Len(Key)
  ' XOR the ANSI codes of all characters'

  For i = 0 To lastEl - 1
    HashCode = HashCode Xor codes(i) 'Xor'
  Next

ErrorGoTo:
  Exit Function
End Function

Clinton Pier.. 10

我敢打赌,当两个字符串使用你的函数生成相同的哈希时,不仅仅是"场合".事实上,它可能比你想象的更频繁.

要做的一些事情:

首先,会有哈希冲突.它发生了.即使有真正的,非常大的空间,如MD5(128位),仍然有两个字符串可以生成相同的结果哈希.您必须通过创建存储桶来处理这些冲突.

其次,长整数并不是一个很大的哈希空间.如果使用更多位,您将获得更多冲突.

第三,在Visual Basic中可以使用的库(比如.NET的System.Security.Cryptography命名空间)可以比大多数凡人更好地进行散列.



1> Clinton Pier..:

我敢打赌,当两个字符串使用你的函数生成相同的哈希时,不仅仅是"场合".事实上,它可能比你想象的更频繁.

要做的一些事情:

首先,会有哈希冲突.它发生了.即使有真正的,非常大的空间,如MD5(128位),仍然有两个字符串可以生成相同的结果哈希.您必须通过创建存储桶来处理这些冲突.

其次,长整数并不是一个很大的哈希空间.如果使用更多位,您将获得更多冲突.

第三,在Visual Basic中可以使用的库(比如.NET的System.Security.Cryptography命名空间)可以比大多数凡人更好地进行散列.



2> jjnguy..:

这两个字符串具有相同的字符.(注意翻转的'2'和'1')

这就是散列值相同的原因.

确保哈希函数考虑了字符的顺序.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有