В изначальном варианте, алгоритм был адаптирован на работу с хеш-таблицами, то есть на начальной стадии имелось сообщение s произвольной длины L, от которого требовалось найти хеш значение h. Перед вычислением значение h устанавливается в 0. Сообщение считывается посимвольно. Число m — предполагаемый размер таблицы.
Шаг 1
Каждый считанный символ с сообщения s переводится в число, а затем рассматривается его битовое значение. Преобразование отдельного символа в целое число обычно поддерживается языками программирования. Например, Pascal предоставляет для этого функцию ord, а С автоматически преобразовывает символ в целое число при выполнении арифметических операций.
Для полученного значения с производится сдвиг h на 4 позиции влево и суммирование с с.
Шаг 2
Производится проверка: если любой из 4 старших битов h равен 1 то сдвигаем их вправо на 24 позиции. Затем выполняем операцию исключающего или со значением h и сбрасываем значения 4 старших битов в 0.
Шаг 3
После проведения шагов 1-2 со всеми символами сообщения s, производится деление h по модулю m. Полученное число — это номер списка в таблице, к которому следует присоединить данную строку.
Код
procedure TForm1.Button1Click(Sender: TObject);
var str:string;
i,h,g:integer;
begin
h:=0;
g:=0;
str:=edit1.text;
for i:=1 to length(str) do
begin
h:=(h shl 4)+ord(i);
{ if g=(h and $00000000) then }
if $00001111 <> (h or $00001111) then
h:= h xor (g shr 24);
h:=h xor g;
h:=h and $00001111;
end;
h:=h mod 211;
edit2.text:=inttostr(h);
end;
var str:string;
i,h,g:integer;
begin
h:=0;
g:=0;
str:=edit1.text;
for i:=1 to length(str) do
begin
h:=(h shl 4)+ord(i);
{ if g=(h and $00000000) then }
if $00001111 <> (h or $00001111) then
h:= h xor (g shr 24);
h:=h xor g;
h:=h and $00001111;
end;
h:=h mod 211;
edit2.text:=inttostr(h);
end;
Вроде как и работает, но по-моему как-то не так ... С битами работаю первый раз, может наврал где ...
Тестовый пример указан a(англ раскладка) - 97, а у меня для а хэш-функция получается равной 1...
Помогите пожалуйста разобраться.