2013-12-10 5 views
0

У меня есть это, я хотел бы сделать его более эффективным, и если вам нужна вся структура данных хэш-набора, которую я создал, я могу добавить ее, но im в целом ищет что-то вроде этого который принимает любое количество строк и сохраняют их в моей пользовательской реализации HashSet:нужна более эффективная реализация этого агонита хэширования FNV в java

private int hash(String key) 
{ 
    int prime = 31; 
    int hash = 0; 

    for(int i = 0; i < key.length(); i++) 
    { 
     hash *= prime; 
     hash ^= key.charAt(i); 
    } 

    if (hash < 0) 
     hash *= -1; 

    return hash % array.length; 
} 
+0

Если вы хотите генерировать хэш-код для массива строк, мы создали встроенную функцию типа Arrays.hashCode (Object []) ':' Arrays.hashCode (strArray) '. Простой и эффективный – Sage

+0

Извините, я не сказал, не использовал java api, мне нужно добавить слово за словом – user3080111

+0

Не могли бы вы сделать его немного более понятным. Вы передаете функцию String to hash, но возвращаемый оператор имеет 'array.length': откуда появился этот массив? – Sage

ответ

0

несколько наблюдений:

  • это общепризнанных в эти дни, что 33 является лучшим выбором штриха, чем 31, потому что это приводит к меньшему количеству столкновений на большинстве неанглийских языков (английский имеет примерно одинаковое значение количество столкновений в любом случае).
  • Преобразования вашей строки в массив символов и доступ к элементам таким образом, а не вызывать Шар() несколько раз, вероятно, будет быстрее
  • Следующий код неэффективен:

    if (hash < 0) 
        hash *= -1; 
    

    Этот код лучше , потому что (1) он не использует команду процессор умножения, который требует значительных ресурсов, и (2) она не производит ошибочность прогнозирования ветвления периодически:

    hash &= ~0x80000000; 
    
Смежные вопросы