/ / dart, czy xoring dwa hashcode zawsze zwraca nowy unikalny hashcode? - lotka, hashcode

dart, czy jest xoring dwa hashcodes zawsze będzie zwracać nowy unikatowy hashcode? - dart, hashcode

Piszę zajęcia, które muszą mieć wyjątkowy charakterhashcode na podstawie dwóch jego pól i chciałem wiedzieć, czy XORing 2-hashcodes dla dwóch pól wystarczy, aby wygenerować unikalny i spójny hashcode dla mojego obiektu?

class _TypeMatch{
final Type _potentialSubtype;
final Type _supertype;

int _cachedHashCode;

_TypeMatch(this._potentialSubtype, this._supertype){
_cachedHashCode = _potentialSubtype.hashCode ^ _supertype.hashCode;
}

int get hashCode => _cachedHashCode;

bool operator ==(other){
return other is _TypeMatch && _cachedHashCode == other._cachedHashCode;
}
}

Widziałem to pytanie tutaj co wydaje się sugerować, że XORing dwóch innychhashcodes to właściwa rzecz, ale najpierw mnożą każdy hashcode przez 2 duże liczby pierwsze, a ja nie byłem pewien, dlaczego lub czy było to konieczne. Niepokoi mnie przede wszystkim to, że w przypadku dwóch typów A i B:

new _TypeMatch(A, B) == new _TypeMatch(A, B) // is true for all A and B

i że obliczenie połączonego skrótu wynositak efektywne, jak to możliwe, jak tworzenie nowego _TypeMatch będzie podstawową częścią systemu, więc wszelkie nieefektywności wydajności będą drastycznie odczuwalne w całym systemie.

Aktualizacja

Kody skrótu są używane na przykład w haszapie lubhashtable, aby równomiernie rozdzielić przechowywane klucze / wartości do „gniazd”. Jedno miejsce może zawierać wiele kluczy / wartości, ale przy użyciu kodu skrótu łatwo i szybko można znaleźć miejsce na mapie, a stamtąd szukać konkretnego klucza / wartości w znacznie mniejszym zestawie wartości. Poprawia to szybkość bardzo szybkiego wyszukiwania na mapie, bez względu na to, jakiego rodzaju dane są używane dla klucza. Gdyby hashcode zmienił się dla zapisanego klucza / wartości, wartości nie można już odzyskiwać według klucza. Możesz po prostu użyć 1 jako hashcode dla każdego obiektu, ale to by zniszczyłowydajność. Otrzymujesz efekt odwrotny (optymalna wydajność) przy dobrym rozkładzie (różne kody skrótu dla różnych obiektów), ale jest limit. Gdy użyjesz na przykład 32-bitowej liczby całkowitej dla kodu skrótu, liczba możliwych kodów skrótu jest ograniczona. Widzieć http://en.wikipedia.org/wiki/Hash_table po więcej szczegółów. Istnieje jednak wiele innych przypadków użycia skrótów.

Odpowiedzi:

2 dla odpowiedzi № 1

Sugeruję użycie hash2 metoda z pakietu kołczanu

https://github.com/google/quiver-dart/blob/master/lib/src/core/hash.dart#L26

Możesz go użyć jak

import "package:quiver/core.dart" show hash2;

@override
int get hashCode => hash2(val1, val2);

Używają tego kodu do łączenia kodów mieszających

int _combine(int hash, int value) {
hash = 0x1fffffff & (hash + value);
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}