2016-11-07 22 views
2

私はサーバーへのファイルアップロードを処理するPHPスクリプトを作成しています。同じ名前のファイルがある場合に上書きを防止するため、プログラムはアップロードされた各ファイルの名前を現在のタイムスタンプに変更します。mt_rand()が同じ時刻に実行された場合、結果は同じになりますか?

ただし、これでは不十分です。ピーク時には、同じ秒でアップロードされるファイルが存在する可能性があります。アップロードされたファイルのファイル名が異なることを確認するために、タイムスタンプの最後に乱数を追加することを考えています。

その後、私はthe official PHP page on srand()

注から読み取る: にsrand()またはこれが自動的に行われるようにmt_srand()で乱数生成器にシードする必要はありません。

私はsrand()のタイムスタンプを使用していると思います。 2つのファイルが同じ秒でアップロードされている場合は、srand()のタイムスタンプのようにランダムな結果は同じですか?はいの場合、名前が同じ秒にアップロードされても名前が重複しないようにする方法はありますか?

+0

脇に: 'srand' /' mt_rand'を使ってフックしていない、おそらくPHPのランダム性を見ている人ならhttps://gist.github.com/tom--/35f8a029d77467559cf2か、 laravelパッケージhttps://github.com/webpatser/laravel-uuid – haxxxton

答えて

1

これは、種子

#define GENERATE_SEED() (((zend_long) (time(0) * GetCurrentProcessId()))^((zend_long) (1000000.0 * php_combined_lcg()))) 
#else 
#define GENERATE_SEED() (((zend_long) (time(0) * getpid()))^((zend_long) (1000000.0 * php_combined_lcg()))) 

https://github.com/php/php-src/blob/6053987bc27e8dede37f437193a5cad448f99bce/ext/standard/php_rand.h#L69

を生成するコードだから、タイムスタンプとプロセスIDの組み合わせだと擬似ランダム

https://github.com/php/php-src/blob/6053987bc27e8dede37f437193a5cad448f99bce/ext/standard/lcg.c#L45

combinedLCG(あり) (0、1)の範囲の擬似乱数を返します。
この関数は、
2^31 - 85と2^31-249の期間を持つ2つのCGを結合します。この関数の期間は、両方の素数の積に等しくなります。

だから、私はあなたが彼らが一致しないことを安心することができると思います。

1

いいえ、seedは、数字の範囲ではなく、乱数の範囲に使用されます。ランダム生成された範囲の単一の数字が表示されます。同じ疑似乱数を得る可能性はまだあります。

代わりにmd5(time().$filename.'.'.$extension)のようなものを追加してみてください。

+0

私は同じファイル名を持つ可能性はまだあると理解していますが、乱数の範囲を考えれば十分に小さいはずです。同じランダムな結果を持つ可能性は、同じ秒でアップロードされた2つのファイルに対して同じファイル名を持つことと似ているはずです。 – cytsunny

+0

同じ秒はコンピューターのAEONSです。秒は1000ミリ秒です...それは既にタイムスタンプで1000種類の可能性があります。非常に同じミリ秒で2つのファイルがディスクに書き込まれる可能性は非常に低いです。たとえそうであっても、それをランダムに追加することでそれを解決できます。 – Tschallacka

関連する問題