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までコアではないため)。そのためには、md5_base64サブルーチンをCPANのDigest :: Perl :: MD5(およびそれが呼び出す/使用する他のサブルーチンと定数)からコピーするだけです。

于 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

多種多様なドメインやWebサイトを処理している場合、これはおそらく理にかなっていますが、サンプルデータを確認していないため、わかりません。

この(または任意の)スタイルのURLマッピングとの衝突が発生する可能性がある場合は、ファイルシステムをハッシュ構造として扱ってみてください。ルートディレクトリをハッシュ(システムに応じて32kから255 ^ 255のバケット)と見なし、そこにファイルを直接配置することができます。衝突にどのように対処するかは、データの量と発生の可能性によって異なります。

于 2010-02-01T08:49:49.863 に答える