2015-03-24 2 views
0

У меня есть гистограмма, которая является вектором/списком чисел. Что такое простой и эффективный алгоритм для получения хэш-кода такой гистограммы? Хэш-код просто нужно разбить изображения на хеш-значение и не сравнивать изображения.Что такое эффективный и эффективный алгоритм hashcode для гистограммы?

У этого приложения нет проблем с безопасностью, поэтому криптографические функции излишне медленны.

+0

Ваш вопрос довольно расплывчатым. Является ли ваша гистограмма просто списком или многомерным массивом чисел? Что не так, умножая каждое число на простое и добавляя его к общей сумме, которая позволяет переполнять? Это самый простой подход хэширования. –

+0

Просто список! Этот подход вызывает переполнение, а значения хэша отрицательны! Интересно, это неэффективно! (новичок) Извините за неопределенный вопрос.довольно запутанный и вне времени И на гистограмме хранится 16384 ящиков! – WizzyVid

ответ

0

Способ хэш-списка состоит в объединении хэшей для каждого элемента. Java implements the hash function для list как так:

public int hashCode() { 
    int hashCode = 1; 
    for (E e : this) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
    return hashCode; 
} 

Известные свойства:

  1. хэш-код для каждого пустого списка точно 1.
  2. Хэш-код для списков с различным количеством элементов, скорее всего, будет другим.
  3. Хэш-код для списков с одинаковым количеством элементов, скорее всего, столкнется. Списки с теми же элементами в другом порядке будут сталкиваться; хэш-код для списков [1,2] и [2,1], к сожалению, идентичны.
  4. Это большой недостаток, но не такой большой, как вы могли бы подумать вначале. Таблицы хэш реализуют резервную копию, где он проверяет равенство хэш-кодов и второе равенство. Если различие в порядковом оформлении происходит вблизи передней части списков, эта резервная проверка выполняется быстро. В худшем случае, только количество сравнений сравнивается с длительностью списков.

В целом, это будет довольно хорошая хэш-функция для вашего прецедента, даже если вы используете числовое значение каждой записи гистограммы для своего хеш-кода. Проблема, которую вы действительно хотите избежать с помощью хеш-функций, является общей-делимостью, то есть вы хотите, чтобы выходы из вашей хеш-функции попадали в разные ведра хэш-таблицы. Wikipedia article покрывает свойства хорошей хэш-функции, если вы хотите получить дополнительную информацию.

Чтобы получить лучший хеш-код для списка номеров, мы должны посмотреть на better hash code for an individual number, в частности this answer.

unsigned int hash(unsigned int[] list) { 
    unsigned int hashCode = 0; 
    for (int i = 1; i < list.length; i++) { 
     hashCode = hashCode + list[i]; 
     hashCode = ((hashCode >> 16)^hashCode) * 0x45d9f3b; 
     hashCode = ((hashCode >> 16)^hashCode) * 0x45d9f3b; 
     hashCode = ((hashCode >> 16)^hashCode); 
    } 
    return hashCode; 
} 

Я думаю что это хорошая адаптация, но я не ожидал.

Что касается эффективности переполнения, это не серьезное замедление, если только вам не придется обрабатывать исключения. В Java, arithmetic will never throw an overflow exception, вместо этого просто оберните его до минимального или максимального значения. Нет никакого реального недостатка в наличии отрицательного hashcode, если ваша реализация хэш-таблицы поддерживает его.

0

не может понять вашу проблему правильно, но HashMaps уже в MATLAB, они просто имеют другое имя

containers.maps

Смежные вопросы