2017-02-06 10 views
0

私は最大6の長さと数字とアルファベットの混在した文字列が必要です。 12.私の質問、このコードの出力は常に一意であるかどうかということである - 10はbase_convertと制限された長さを持つPHPでユニークな文字列を作成

How can I make short random unique keys, like YouTube video IDs, in PHP?

PHP generate a unique string

を非常に有用であったことが、彼らは長さの文字列を作る:私がチェックされていますか?

base_convert(microtime(false), 6, 36); 

又は

base_convert(uniqid('test',true), 6, 36); 

:私はベース6からの変換が、入力が明らか36に10から変換する場合、それが生成するので、私はそれを行うベース6であることを行っていません10- 12の長さ。

+0

私はあなたがベース6から変換しようとしているが、入力は明らかに6 – apokryfos

+0

@apokryfos はい私がベースであることを行っていないので、これはまったく機能とは思いません。私は10から36に変換すると10-12の長さを生成するので、私はそれを行います。 どうすればいいですか? –

+0

しかし、基数6は、数値がすべて0〜5の間であることを意味します。あなたは代わりに['substr'](http://php.net/manual/en/function.substr.php)を実行する必要があります – apokryfos

答えて

1

短い答え:いいえ、個人的なウェブサイトのような小さなものや、非常に少数の人しか使用しない内部的なツールを実行しても問題ありません。

長い答え:安全なことをしようとしている場合や、データベースを共有する複数のサーバーを使用している場合は、間違いありません。攻撃者は、リクエストがサーバーに到達するまでの時間を正確に把握し、マイクロタイムに頼っている場合は、サーバーが重複したIDを生成するまで要求に砲撃することができます。 uniqid関数はuniq値(PHPマニュアルからまっすぐ)を返すことは保証されていません。また、NTPを使用して時間を更新する場合は、重複IDを確実に生成し、5秒前に時間を調整します。

+0

どうすればいいですか? –

+0

何かを一意にする最も簡単な方法は、カウンタでアトミックな操作を行うことです。これを行う最も簡単な方法は、SQLデータベースを使用して、自動インクリメントされたIDに依存することです。データベースを使用したくない場合は、単純な整数を格納するファイルシステム上にファイルを作成することができます。排他的ファイルロック、ロック待機、およびロック解除を実装する必要があります。 http://php.net/manual/en/function.flock.phpについて読む – Dimi

関連する問題