Вниз
Скачать: 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.009 c
3-100143
pa\/el
2003-03-12 10:17
2003.03.31
Экзотическая БД


7-100483
RimD
2003-01-30 21:45
2003.03.31
Круг


6-100356
oleg_poligon
2003-02-08 13:24
2003.03.31
Sockets


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


14-100459
PVOzerski
2003-03-13 13:00
2003.03.31
Как восстановить зарегистрированность Delphi?




   Наверх