2012-02-14 2 views
0

Привет, я пытаюсь разработать фильтр цветения счета в java. я действительно искал большинство источников о фильтре цветения. То, что я понял, это когда мы хешируем (делаем хеширование) конкретной строкой или словом, результат хеширования вернет одно значение, чтобы мы могли сохранить контент в этом результирующем значении место. Но мой большой вопрос - как сделать хэширование (алгоритм). Что действительно происходит, когда мы используем конкретную строку или слово. Можете ли вы, пожалуйста, объяснить мне, что на самом деле происходит, когда мы хешируем конкретную строку или слово (Как то, как появляется конкретное конечное значение, когда мы делаем хэширование определенной строки или слова). Я также читаю, что есть также шансы на столкновение. Можете ли вы также указать, почему результирующее значение хэша не уникально (почему его иногда возвращает одно и то же значение хэша для разных входов). И действительно ли мне нужно написать код для хэширования или есть встроенные функции java для хеширования.Что действительно происходит (фактический процесс), когда мы используем конкретную строку или слово

+0

Пожалуйста, изучите тему немного, прежде чем задавать вопросы: http://en.wikipedia.org/wiki/Hash_function –

+1

В фильтре цветения вам нужно больше одного хеша. – UmNyobe

ответ

1

Вы можете просто получить хеш-код, вызвав hashCode() на любой объект. В частности, для класса String из javadoc:

общественности Int() хэш-код

Возвращает хэш-код для этой строки. Хеш-код для объекта String вычисляется как

s [0] * 31^(n-1) + s [1] * 31^(n-2) + ... + s [n-1 ]

с использованием int арифметики, где s [i] является i-м символом строки, n - это длина строки, а^указывает на возведение в степень. (Значение пустой строки хэш равен нулю.)

0

Код выполняется для String это одно:

public int hashCode() { 
int h = hash; 
    int len = count; 
if (h == 0 && len > 0) { 
    int off = offset; 
    char val[] = value; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 

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

1

«хеширования» является функцией

H: I -> O

Где обычно множество I гораздо больше или более сложным, чем O. В хэш-таблице I - класс ваших элементов, а O - множество положительных целых чисел. В частности, в цветном фильтре у вас есть n различных функций. Чтобы разработать хеш-функцию, вам нужно извлечь различные характеристики похожих объектов. Например, для символьных строк вы можете иметь:

  • длина
  • первый символ
  • количество вхождений определенного символа
  • строка оценивается как полиномиальное h(S) = sum (s(i)*31^i) mod d

При использовании множественного хеш-столкновения характеристик следует избегать, например, используя number of voyels и number of non-voyels не очень полезно.Есть некоторые особенности в хэш-функции должны быть, посмотрите на wikipedia entry

0

Java позволяет переопределить метод хэш-код() для ваших классов использовать алгоритм хэширования

public class Employee { 


    // Default implementation might want to use "name" for as part of hashCode 
    private String name; 

    @Override 
    public int hashCode() { 
    // We know that ID is always unique, so don't use name in calculating 
    // the hash code. & hashCode() is an int 
    return id; 
    } 
} 

* (если вы собираетесь для переопределения hashCode вы также должны переопределить равные.)

Хэш-код вычисляется на объект, хранящийся в коллекции. Он вычисляется с использованием стандартного алгоритма. Вы действительно можете переопределить метод хэш-кода на основе каждого объекта. Одним из способов реализации метода hashcode является использование HashcodeBuilder.

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

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