0

在一个简单的 web 应用程序中,我需要将 URL 映射到文件名或文件路径。

这个应用程序有一个要求,它只能依赖于核心 Perl 发行版(5.6.0 和更高版本)中的模块。问题是大多数文件系统上的文件名长度限制为 255。另一个限制是单个文件夹中有大约 32k 个子目录。

我的解决方案:

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

它可靠吗?如何改进?

4

2 回答 2

4

大多数平台上的 crypt 将忽略输入的前 8 个字符之后的任何内容。鉴于您的要求,我建议 Digest::MD5。

更新:鉴于新的 5.6.0 要求,查找散列算法并实现它以获取数字,然后对其进行 base64 编码(手动,因为 MIME::Base64 在 5.7.3 之前也不是核心。)这样做只是从 CPAN 上的 Digest::Perl::MD5 复制 md5_base64 子例程(以及它调用/使用的其他子例程和常量)。

于 2010-02-01T00:14:06.560 回答
0

为简单起见,我会尝试将 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 个存储桶)并将文件直接放在其中。您如何处理冲突将取决于数据量和发生的可能性。

于 2010-02-01T08:49:49.863 回答