Dva objekty samozřejmě mohou vrátit stejný hash. Říká se tomu kolize. Při porovnávání se v .NETu (na rozdíl od kryptografie, tam jsou hashe podstatně delší) nespoléhá na to, že dvě různé hodnoty budou mít vždy různý hash. Hash se používá jen na místech, kde se ukládají metody do hashovací tabulky (např. Dictionary, HashTable atd.). Např. Dictionary, který slouží k ukládání dvojic klíč-hodnota si v sobě drží tabulku (typicky nějaké úchylné velikosti, např. 19 - jsou to prvočísla). Pokud tam chcete přidat objekt, spočítá se jeho hash, zjistí se zbytek po dělení 19 (resp. aktuální velikostí tabulky) a objekt se uloží na to místo. Může se stát, že dvěma různým objektům vyjde stejný hash, ale klidně i pro objekty s různým hashem se stane, že se díky dělení velikostí tabulky dostanou na stejné místo. Hashovací tabulka má typicky způsoby, jak tohle řešit, typicky si prvky, které se nevejdou, ukládá někam vedle. Pokud je těch prvků vedle víc, nebo je tabulka zaplněná třeba z 60% (pak už začíná být kolizí znatelný počet), hashtabulka se sama zvětší a prvky přesype na nové pozice do nového pole. Když se v tabulce hledá, z hledané hodnoty se spočítá hash a hledá se, jestli v tabulce je stejný objekt - tam se už neporovnává jen podle hashe, ale zavolá se standardní metoda Equals. Hash je jen pro nalezení místa, kde objekt možná je, v konstantním čase.
|