Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.013 c
3-100182
Alderman
2003-03-13 11:44
2003.03.31
Как сделать запрос по результатам запросов


4-100522
maker
2003-01-30 14:41
2003.03.31
Помогите разобратся с чтением из файла


3-100156
Sir Alex
2003-03-12 13:26
2003.03.31
Требуется выбрать вид БД


1-100228
Genik
2003-03-20 11:19
2003.03.31
Задержка в микросекундах


1-100296
andrey_pst
2003-03-19 15:07
2003.03.31
Синхронная прокрутка двух RichEdit.




   Наверх