02.11.2014

Строковый хэш

Наконец-то появилось немножко свободное время. Поэтому решил развлечься. Потренироваться в программировании.
Люблю писать маленькие, совершенно бесполезные и никому не нужные программки. Вот и сейчас, в продолжении предыдущего поста, решил продемонстрировать сам себе, как оно может работать. Естественно, в код обязательно для пущего самоудовлетворения вставляются ассемблерные вставки.
В общем, в формочку надо ввести предложение данные, только на русском языке. Потому что такой дебильный вариант закона о персональных данных только у нас. :) Все приводится к верхнему регистру.
После чего формируется строка, из которой удаляются шумовые символы (пробелы и точки, другие шумовые символы ввести нельзя). Далее это строка по простейшему алгоритму перемешивается. Перемешивание зависит только от самой строки.
После этого происходит расчет хэш-суммы в виде 32-разрядного целого по простейшей схеме, примерно такой:
Sum := Sum*S[i]+S[i].
Недостаток такого подхода состоит в том, что при сколько-нибудь значительно длине строки происходит переполнение 32-разрядного целого, и, таким образом, в формировании хэша участвует только несколько последних символов строки. А начало строки "забывается" алгоритмом.
Что бы избежать этого, старшая часть 64 числа после умножения регулярно складывается с младшей.
Ну и можно указать начальное значение для переменной Sum (поле "Смещение"), это аналог "соли" во избежание быстрого подбора хэша по словарю.
Ну и конечно, в вырожденном случае, когда длина всех символьных полей оказывается мала (то есть все текстовые поля состоят из одной буквы), хэш функция вырождается. Но, я думаю, такое маловероятно с учетом особенностей русского языка. :)
Если что, алгоритм работает с ANSI кодировкой, в принципе, никто не мешал мне использовать UNICODE, но заморачиваться не охота.
Впервые попробовал делать 64-разрядные вставки на ассемблере. Это классно! Дополнительные регистры и 64-разрядные арифметические операции существенно сокращают и упрощают код. Я бы вообще Intel'овскую архитектуру запретил законодательно. :) да здравствует RISC!
Да, программка здесь, если кому в голову придет безумная идея ее запустить.

Комментариев нет:

Отправить комментарий