短くてユニークなファイル/フォルダー名を生成する良い方法は何ですか?
質問
基準は基本的にこれです:
- フォルダは約24〜48時間存在します
- フォルダ名はユーザーが簡単に推測することはできません(URLで使用されている場合)
- フォルダ名は5〜15文字で短くする必要があります
最初の考え:
printf('%u',crc32(microtime(true)));
詳細: ファイルをアップロードするとき、私は基本的にアップローダーによって命名された一意のファイル名を保持したいので、名前の衝突を避けるために一意の名前のディレクトリに置きたいと思います...
解決
[編集]ちょっと待ってください。 PHPの標準ライブラリには、一意のIDジェネレーター関数が含まれています。 他のアプローチも。
他のヒント
古典的な手法は次のようになります
+ uploader-name
+ 20090401
+ 010000 // hhmmss
+ 013000 // hhmmss
+ 014500 // hhmmss
...
+ 20090402
必要な粒度に基づいて、レベルを追加、「a」、「b」、「c」などを追加します。
これは特に機能します。ユーザーがファイルに関連するすべての年代順である場合。
いくつかの存在の列挙を行うことになりますが、それほど苦痛ではありません。私はこれを何度も使用しました(PHPを含む)。主に、ユーザーの抵抗が私が見つけた他の選択肢よりも低いためです。
このような傾向がある場合は、「2009-Apr-01」、「01:45 AM」などの日付表現を美しくすることができます。
言語が指定されていませんでした。Rubyでは次のようにします。
require 'digest/md5'
Digest::MD5.hexdigest(Time.now.to_s)
=> "f531384b3cc8c60b7c5b7ad087cb0ae4"
これは、「隠蔽によるセキュリティ」のように聞こえます。問題。潜在的に機密性の高いデータを作成し、(短時間であっても)安全な方法でそれを公開するものに対してはお勧めします。ブルートフォース攻撃が存在し、この種の「セキュリティ」を破ることができます。
名前を生成するには、日付と時刻を使用します
次のようなものを使用します:
$salt='Whatever you want';
$folderName=SHA1($salt.date('U'));
Date( 'U')は、Unixエポック(1970年1月1日00:00:00 GMT)からの秒数を返すため、同時に複数のフォルダーを生成しない限り、おそらく一意になるでしょうか?
その場合、$ salt値を微妙に変更するだけです(ユーザー名や乱数などにします)。
ハッシュ(md5またはshaのいずれか)を時間に基づいて作成すると、ディレクトリが生成されたときのおおよそのことをユーザーが知っている場合に推測が可能になります。彼らがする必要があるのは、どちらかの側で数秒カバーされたすべての可能性を生成する単純なスクリプトをセットアップし、そして応答を探してサイトをヒットすることです。塩を追加しても効果はありますが、長期的にはあまり効果がありません。
OPにとって、上記はどのメソッドにも当てはまります。非常に高速なサーバーを実行している場合、ランダムなディレクトリに対するヒットを監視する必要があります。 5文字のディレクトリしかないということは、誰かがディレクトリを発見するのに十分な回数手動でサイトにアクセスできることを意味します。 15では多少増加しますが、スクリプト化された方法でいくつかのマシンを使用することで、可能性が失われることはありません。
C ++標準には、両方ともcstdio(stdio.h)に関数tmpfileとtmpnumがあり、それに応じて一時ファイルと一時ファイル名を作成します。ただし、プログラムの最後にtmpfileは削除されます。リンクしますが、残念ながらまだリンクを投稿できません。