Для обработки коллизий используются две группы методов:
- закрытые — в качестве резервных используются ячейки самой хэш-таблицы;
- открытые — для хранения элементов с одинаковыми хэш-адресами используется отдельная область памяти.
Видно, что эти группы методов разрешения коллизий
соответствуют классификации алгоритмов хэширования — они тоже делятся на
открытые и закрытые. Яркий пример открытых методов — метод цепочек,
который сам по себе является самостоятельным методом хэширования. Он
несложен, и мы рассмотрим его несколько позже.
Закрытые методы разрешения коллизий более сложные. Их основная идея —
при возникновении коллизии попытаться отыскать в хэш-таблице свободную
ячейку. Процедуру поиска свободной ячейки называют пробитом, или
рехэшировани-ем (вторичным хэшированием). При возникновении коллизии к
первоначальному хэш-адресу А(К) добавляется некоторое значение р, и
вычисляется выражение (2.5). Если новый хэш-адрес А(К) опять вызывает
коллизию, то (2.5) вычисляется при р2, и так далее:
А(К) = (A(K)+Pi)mod М (I = 0..М). (2.5)
push ds popes
lea si .buf.len_in
mov cl .buf .lenjn
inccx :длину тоже нужно захватить
add di .lenjd repmovsb
jmp ml displ: :выводим идентификатор, вызвавший коллизию, на экран
рехэширование
;ищем место для идентификатора, вызвавшего коллизию в таблице, путем линейного рехэширования i nc bx mov ax.bx jmp m5