Почему хэш-коды, генерируемые этой функцией, не уникальны? - PullRequest
1 голос
/ 15 сентября 2008

Я тестирую функцию VB ниже, которую я получил из поиска Google. Я планирую использовать его для генерации хеш-кодов для быстрого сравнения строк. Однако бывают случаи, когда две разные строки имеют одинаковый хэш-код. Например, эти строки

"122Gen 1 размер кучи (.NET CLR Memory w3wp): mccsmtpteweb025.20833333333333E-02"

"122Gen 2 размера кучи (.NET CLR Memory 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

Ответы [ 14 ]

0 голосов
/ 15 сентября 2008

Эта конкретная хеш-функция выполняет XOR для всех символов в строке. К сожалению, XOR ассоциативен:

(a XOR b) XOR c = a XOR (b XOR c)

Таким образом, любые строки с одинаковыми входными символами приведут к одному и тому же хеш-коду. Две предоставленные строки одинаковы, за исключением расположения двух символов, поэтому они должны иметь одинаковый хэш-код.

Возможно, вам понадобится найти лучший алгоритм, MD5 будет хорошим выбором.

0 голосов
/ 15 сентября 2008

Здесь есть визуальная базовая реализация хеширования MD5

http://www.bullzip.com/md5/vb/md5-visual-basic.htm

0 голосов
/ 15 сентября 2008

«Не делай этого».

Написание вашей собственной хеш-функции - большая ошибка, потому что ваш язык, безусловно, уже имеет реализацию SHA-1, которая является совершенно хорошей хеш-функцией. Если вам нужно только 32 бита (вместо 160, которые предоставляет SHA-1), просто используйте последние 32 бита SHA-1.

0 голосов
/ 15 сентября 2008

Я не совсем вижу среду, в которой вы работаете. Это код .Net? Если вам действительно нужны хорошие хэш-коды, я бы порекомендовал изучать криптографические хеши (проверенные алгоритмы), а не пытаться писать свои собственные.

Кстати, не могли бы вы отредактировать свой пост и вставить код в качестве примера кода (см. Панель инструментов)? Это облегчит чтение.

...