как постепенно обновлять значение хеша?

0

Я ищу простую инкрементную хеш-функцию (C++), чтобы ее можно было обновить, используя:

               hash = hash_function(hash, update_value)

Например, update_value может быть одним битом.

например, чтобы вычислить хэш массива, я бы сделал:

              hash = 0
              foreach element a in array { hash = hash_function(hash, a) }

(желательно то, что не приводит к слишком большому количеству столкновений, но относительно быстро).

  • 0
    Почему бы вам просто не XOR хэш каждого элемента в массиве вместе
  • 0
    @Pete, элементы в массиве могут быть просто битами. XOR - немного идея, хэш будет только один бит. Мне нужно лучшее преобразование, и я не хочу, чтобы оно приводило ко многим столкновениям.
Показать ещё 1 комментарий
Теги:
hash

1 ответ

1

Если вы хэшируете массив бит:

Вы можете выполнить проверку циклического избыточности. Многочлен CRC определял бы длину хеша и будет (грубо) контролировать вероятность столкновения. Многие примеры программных алгоритмов CRC оптимизированы для работы на вещах, более широких, чем биты, но основной, не оптимизированный алгоритм работает немного за раз. Алгоритм примерно:

  1. Начните с некоторого постоянного начального значения в аккумуляторе
  2. Переместите бит из массива в аккумулятор.
  3. Условно выполните XOR с полиномом. В разных реализациях используется бит, который вы только что сдвинули, бит, который вы только что сдвинули для условного.
  4. Повторите для последующих бит (Goto 2).

Ваш предложенный метод примет текущее значение аккумулятора как 1-й аргумент и вернет следующее значение аккумулятора.

Важен полиномиальный отбор. Существуют некоторые многочлены, которые не считаются хорошими для хеширования.

Если массив содержит что-то немного шире (например, ints или objects):

Вы можете просто хэш каждого элемента и объединить хэш каждого элемента вместе с чем-то вроде XOR. Если хэш-алгоритм для отдельных объектов хорош, то полученный хэш для массива должен быть относительно ок. Обратите внимание, что очень важно сначала отображать отдельные объекты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню