Как я могу сопоставить URL-адреса с именами файлов с помощью Perl? - PullRequest
0 голосов
/ 01 февраля 2010

В простом веб-приложении мне нужно сопоставить URL-адреса с именами файлов или путями к файлам.

Это приложение требует, чтобы оно зависело только от модулей в ядре Perl (5.6.0 и выше). Проблема в том, что длина имени файла в большинстве файловых систем ограничена 255. Другое ограничение - около 32 КБ подкаталогов в одной папке.

Мое решение:

my $filename = $url;

if (length($filename) > $MAXPATHLEN) { # if filename longer than 255
    my $part1 = substr($filename, 0, $MAXPATHLEN - 13);        # first 242 chars
    my $part2 = crypt(0, substr($filename, $MAXPATHLEN - 13)); # 13 chars hash
    $filename = $part1.$part2;
}
$filename =~ s!/!_!g; # escape directory separator

Это надежно? Как это можно улучшить?

Ответы [ 2 ]

4 голосов
/ 01 февраля 2010

crypt на большинстве платформ будет игнорировать что-либо после первых 8 символов ввода. Учитывая ваши требования, я бы предложил Digest :: MD5.

Обновление: учитывая новое требование 5.6.0, найдите алгоритм хеширования и реализуйте его, чтобы получить число, затем закодируйте его с помощью base64 (вручную, поскольку MIME :: Base64 также не является основным до версии 5.7.3.) Быстрый способ сделать это - просто скопировать подпрограмму md5_base64 из Digest :: Perl :: MD5 в CPAN (и другие подпрограммы и константы, которые она вызывает / использует).

0 голосов
/ 01 февраля 2010

Для простоты я бы попробовал разбить URL на его (логические) составные части, чтобы вы получили красивую аккуратную структуру каталогов, которая сопоставляется с URL:

/
/http
/https
/http/com
/http/com/google
/http/com/stackoverflow
/http/com/stackoverflow/questions
/http/com/stackoverflow/questions/2173839

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

Если вы можете столкнуться с коллизиями с этим (или любым) стилем отображения URL, попробуйте трактовать файловую систему как хеш-структуру . Вы можете рассматривать корневой каталог как хеш (где угодно от 32k до 255 ^ 255 сегментов, в зависимости от системы) и помещать файлы прямо туда. То, как вы справитесь с коллизиями, будет зависеть от объема данных и вероятности их возникновения.

...