Есть ли модуль CPAN, который переваривает короткую строку в короткий номер? - PullRequest
4 голосов
/ 26 марта 2009

Мне нужно создать уникальные числовые идентификаторы для некоторых коротких строк.

some.domain.com    -> 32423421
another.domain.com -> 23332423
yet.another.com    -> 12131232

Есть ли модуль Perl CPAN, который будет делать что-то подобное?

Я пытался использовать Digest :: MD5, но полученные числа слишком длинные:

some.domain.com    -> 296800572457176150356613937260800159845 

Ответы [ 3 ]

16 голосов
/ 26 марта 2009

Просто возьмите первые 8 цифр хеша MD5. Это работает, потому что MD5 равномерно распределено по его хеш-адресу . Это означает, что любая последовательная последовательность цифр хеша MD5 сама будет равномерно распределенным хешем.

В качестве альтернативы, просто используйте какой-то другой равномерно распределенный механизм хеширования, который возвращает 8 чисел. Что бы тебе ни было легче.

4 голосов
/ 26 марта 2009

Учитывая тот факт, что строки выглядят как имена хостов, возможно, вы просто разрешите их в ip и представите ip как целое число?

Вроде как:

perl -le 'my $ip = gethostbyname("depesz.com"); my $num = unpack("N", $ip); print $num'
1311657670
4 голосов
/ 26 марта 2009

Либо Дайджест :: CRC или Строка :: CRC32 . Первый дает вам возможность вычислять 8-, 16- и 32-битные контрольные суммы, а второй поддерживает только 32-битные.

...