25.07.2017 Views

Intro-CSharp-Book-v2015

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Глава 18. Речници, хеш-таблици и множества 743<br />

Важно е да се запомни, че при хеш-таблиците не можем да разчитаме на<br />

никаква наредба на елементите. Ако се нуждаем от такава, можем преди<br />

отпечатване да сортираме елементите. Друг вариант е да използваме<br />

SortedDictionary.<br />

Хеш-функции и хеширане<br />

Сега ще се спрем по-детайлно на понятието, хеш-код, което употребихме<br />

малко по-рано. Хеш-кодът представлява числото, което ни връща т.нар.<br />

хеш-функция, приложена върху ключа. Това число трябва да е различно<br />

за всеки различен ключ или поне с голяма вероятност при различни<br />

ключове хеш-кодът трябва да е различен.<br />

Хеш-функции<br />

Съществува понятието перфектна хеш-функция (perfect hash function).<br />

Една хеш-функция се нарича перфектна, ако при N ключа, на всеки ключ<br />

функцията съпоставя различно цяло число в някакъв смислен интервал<br />

(например от 0 до N-1). Намирането на такава функция в общия случай е<br />

доста трудна, почти невъзможна задача. Такива функции си струва да се<br />

използват само при множества от ключове, които са с предварително<br />

известни елементи или поне ако множеството от ключове рядко се променя.<br />

В практиката се използват други, не чак толкова "перфектни" хешфункции.<br />

Сега ще разгледаме няколко примера за хеш-функции, които се използват<br />

директно в .NET библиотеките.<br />

Методът GetHashCode() в .NET платформата<br />

Всички .NET класове имат метод GetHashCode(), който връща стойност от тип<br />

int. Този метод се наследява от класа Оbject, който стои в корена на<br />

йерархията на всички .NET класове.<br />

Имплементацията в класа Object на метода GetHashCode() e такава, че не<br />

се гарантира уникалността на резултата. Това означава, че класовете<br />

наследници трябва да осигурят имплементация на GetHashCode(), за да се<br />

ползват за ключ на хеш-таблица.<br />

Друг пример за хеш-функция, която идва директно в .NET, е използваната<br />

от класовете int, byte и short (дефиниращи целите числа). Там за хеш-код<br />

се ползва стойността на самото число.<br />

Един по-сложен пример за хеш-функция е имплементацията на класа<br />

string:<br />

public override unsafe int GetHashCode()<br />

{<br />

fixed (char* str = ((char*)this))<br />

{

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!