0

アップロードされるファイルに名前を付けて、繰り返さないようにするための複雑なアルゴリズムをphpで提案できますか? 何百万もの動画があるYouTubeはどうやってやっているのかしら??

現在、乱数を使用して16文字のsha1ハッシュを取得し、その名前でファイルに名前を付けていますが、ファイルをファイルシステムに保存できないため、最終的には繰り返されてエラーが生成されると確信しています.

何かのようなもの:

$name = sha1(substr(sha1(md5($randomnumber)),0,10));

このコードによって生成されたハッシュを解読することは不可能であるか、少なくとも解読するには 100 年かかるだろうと誰かが言ったことがあります。

4

5 に答える 5

4

あなたができる:

$uniq = md5(uniqid(rand(), true));

次のように、ファイルをアップロードしているユーザーのユーザー ID を追加することもできます。

$uniq = $user_id_of_uploader."_".md5(uniqid(rand(), true));
于 2013-01-24T04:55:06.800 に答える
1

既存の実装を使用して GUID (UUID と呼ばれることもあります) を生成します。GUID は、コンピューター、タイムスタンプ、そのタイムスタンプ中に生成された GUID などごとに一意であるため、繰り返されることはありません。

GUID を作成できない場合は、入力全体で sha1 を使用し、その出力全体を使用することをお勧めします。

于 2013-01-24T05:03:32.317 に答える
1
$name = 'filename'.$user_id(if_available).md5(microtime(true)).'extension';

ファイル名から特殊文字と空白を削除してみてください。

名前をデータベースに保存する場合は、再帰関数が役立ちます。

于 2013-01-24T05:06:48.930 に答える
0

適切な方法で以下を実行してください。

  • 最初のスライスの拡張子とファイル名
  • ファイル名をトリムする
  • 複数のスペースを単一のスペースに変更
  • 特殊文字と空白をに置き換えます_
  • で区切られた現在のタイムスタンプを使用したプレフィックス strtotimeとソルトを使用したプレフィックス( @Sudhir に感謝)md5(uniqid(rand(), true))_
  • str_padファイルのテキスト長を使用して制限する特別な署名付きのサフィックス
  • ここで再び拡張子とフォーマットされたファイル名を追加します

それが理にかなっていることを願っています。

ありがとう

于 2013-01-24T05:00:39.347 に答える
0

私は通常、ファイル名の文字列を生成し (実装はそれほど重要ではありません)、その名前のファイルが既に存在するかどうかを確認します。その場合、それにカウンターを追加します。どういうわけか同じベース ファイル名のファイルが多数ある場合、これは非効率的である可能性がありますが、文字列が十分に一意であると仮定すると、それほど頻繁に発生することはありません。ファイルが存在することを確認するオーバーヘッドもあります。

$base_name = generate_some_random_string(); // use whatever method you like
$extension = '.jpg'; // Change as necessary
$file_name = $base_name . $extension;
$i = 0;
while (file_exists($file_name)) {
    $file_name = $base_name . $i++ . $extension;
}
/* insert code to save the file as $file_name */
于 2013-01-24T05:20:49.083 に答える