Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.31;
Скачать: CL | DM;

Вниз

Снова про хэш функции   Найти похожие ветки 

 
oomneeq ©   (2003-03-19 11:10) [0]

Приветствую уважаемое сообчество,

Мне нужна функция, генерирующая соответствие литералам (уникальным именам) уникальный целочисленный код.

т.е. насколько я в этом успел разобраться, это называется хэш функцией.
вот например такая (ктото когдато на нее показал)

//Hash-function - stolen from ($DELPHI)\Source\Vcl\dbtables.pas
function GetHashCode(Str: PChar): Integer;
var
Off, Len, Skip, I: Integer;
begin
Result := 0;
Off := 1;
Len := StrLen(Str);
if Len < 16 then
for I := (Len - 1) downto 0 do
begin
Result := (Result * 37) + Ord(Str[Off]); //(1)
Inc(Off);
end
else
begin
{ Only sample some characters }
Skip := Len div 8;
I := Len - 1;
while I >= 0 do
begin
Result := (Result * 39) + Ord(Str[Off]);
Dec(I, Skip);
Inc(Off, Skip);
end;
end;
end;


Про коллизии я в курсе, и оговорюсь сразу, что в моей задаче пространство имен весьма небольшое, скажем заведомо меньше 1000

то есть ф-я насколько я понимаю может быть не сильно навороченная.
Вышеуказанная функция от Борланда мне не подошла, т.к. генерит числа, вылетающие за диапазон интежер уже на первом десятке имен
/строка (1)/
попытался искать в сети, вылезают ссылки на темы, связанные с шифрованием данных, всякие там криптоалгоритмы, что для моей скромной надобности явный перебор.
Поэтому и обращаюсь сюда.
Присоветуйте люди добрые, другую функцию, попроще.
Благодарность не будет знать границ в пределах разумного :)


 
Jel ©   (2003-03-19 11:17) [1]

Простейший способ - посчитать CRC32 строки.


 
Digitman ©   (2003-03-19 11:25) [2]

CRC64 как альтернативный данному алгоритм дает неплохие результаты на достаточно большом множестве строк (до 10 млн.), содержаших любые печатные символы (в любых регистрах) в произвольной комбинации... я несколько раз тестировал данный алгоритм при таком множестве и для таких условий - повторений не получил



Страницы: 1 вся ветка

Текущий архив: 2003.03.31;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
1-100269
Big_Rom
2003-03-19 07:13
2003.03.31
Fastreport


1-100300
Danik
2003-03-19 16:07
2003.03.31
Как скопировать директорию


1-100242
Rzhev
2003-03-18 15:43
2003.03.31
Заголовок на кнопке


3-100186
Roki
2003-03-12 10:15
2003.03.31
Как в IB(FireBird) снимать статистику доступа к БД?


3-100181
me2
2003-03-13 09:09
2003.03.31
Блокировка записей