Zakładając trzeba prędkość bez obciążania *Set
klas, a następnie można napisać H
następująco:
/**
* Hashes a set of integers.
*
* @param list to hash
* @return hash code
*/
public static int H(int list[]) {
// XOR all the integers together.
int hashcode = 0;
for (int val : list) {
hashcode ^= val;
}
return hashcode;
}
To jest taka sama niezależnie od kolejności, i to jest stosunkowo wydajny.
Na przykład:
public static void main(String[] args) {
System.out.println(Integer.toHexString(H(new int[]{0xabcd,0x1234,0x1111})));
System.out.println(Integer.toHexString(H(new int[]{0x1234,0x1111,0xabcd})));
}
Wyświetla:
a8e8
a8e8
ten można uogólnić na więcej niż tylko int
s, wykonując następujące czynności:
/**
* Hashes a set of objects.
*
* @param list to hash
* @return hash code
*/
public static int H(Object list[]) {
// XOR all the hashes together.
int hashcode = 0;
for (Object val : list) {
hashcode ^= val.hashCode();
}
return hashcode;
}
Program main
będzie wtedy muszą używać tablic o wartości Integer
instea d prymitywu int
.
Dodawanie liczb powinno być prawie tak szybkie i może dać lepszą dystrybucję w zakresie 32 bitowym. Jeśli elementy zestawu są już równomiernie rozłożone w zakresie, to xor może być lepszy.
Jednak za pomocą obu metod można łatwo tworzyć kolizje z liczbami całkowitymi. Na przykład za pomocą metody dodawania;
{1000, 1001, 1002}
{0, 1, 3002}
Obie macierze mają taką samą H()
.
Za pomocą metody XOR;
{0x1010, 0x0101}
{0x1111, 0x0000}
Oba mają tę samą H()
.
Podobnie, element 0
jest problematyczny, ponieważ listy będą miały ten sam skrót z nim lub bez niego. Można to ograniczyć, dodając stałą wartość w każdej iteracji. Na przykład:
...
hashcode += val.hashCode() + CONSTANT;
...
Albo o tym, jak wiele elementów pierwotnego kodu skrótu:
...
// XOR all the hashes together.
int hashcode = list.length;
...
Połączone algorytmy w Wikipedii są dla haszyszu ** wektory **, czyli są one uporządkowane. –
@Antti Haapala: Zamówione to nie to samo, co posortowane. Krotka '(2, 1, 5)' jest uporządkowana, ale nie posortowana. – jason
@Jason: tak, i nie ma to nic wspólnego z pytaniem, zestawy nie są uporządkowane. –