1

ユーザー プロフィール画像に名前を付けるプロセスを使用していますが、衝突が心配です。私が使用している名前パターンは次のとおりです。

9999999_9999999_9999999

したがって、画像には次のような名前が付けられます。

4533381_1284948_8023255.jpg

整数の範囲は1.000.000から9.999.999 です。同じ名前の画像がユーザー プロファイル画像ディレクトリに既に存在するかどうかを確認する必要がありますか? (すべてのイメージが同じディレクトリ レベルにあると仮定します)。

整数はphp関数を使用して生成されますmt_rand(1000000,9999999);

4

2 に答える 2

1

あなたの場合、衝突の可能性は非常に低いです(可能ですが)。

  • イメージ名のすべての可能な値を数えています: (9999999-1000000+1)^3 == 7.29 * 10^20

    ヒント:文字列に変換する際に、 との間の数値を生成し、左側にゼロを埋め込むことで、この値を増やすことができます09999999次に例を示します。sprintf("%07d", $number)

  • mt_rand比較的優れた乱数発生器です。

衝突はおそらく起こらないでしょう。


ただし、アプリのコンテキストで簡単な場合は、名前が占有されていないことのチェックを実装できます。そうでない場合は、同じ方法でランダムな名前を再生成するだけです。

do { $name = generate_name(); } while(is_occupied($name));ループの一種。


このソリューションは、コメントで提案されている決定論的ハッシュよりも安全であることに注意してください。

その理由は、ハッシュの衝突も発生する可能性があり、衝突が発生した場合は完了です — これは決定論的であり、別の乱数を生成する可能性はありません。

または、衝突の場合には一連のハッシュ関数を使用する必要があります。これは、同様の do-while ループを意味しますが、ハッシュが計算されるデータと (ハッシュ計算に影響する) カウンターを含む、少し複雑です。メリットのないコードが増える、IMO。

于 2015-01-08T20:25:57.387 に答える
0

簡単な答え: いいえ。

長い答え: 数字と文字の 32 桁のランダムな文字列であっても、最終的に衝突する可能性があります。誰かがコメントしたように、ユーザーIDなど、ユーザーに関連するものを使用し、何らかの形式のハッシュを使用してハッシュする必要があります。

PHP でのハッシュについては、こちらを参照してください。

于 2015-01-08T20:27:27.680 に答える