2

PHPで5文字のuniqidを次のように生成しています。

$id = substr(uniqid(),0,5);

そして、私がそれを呼び出すたびに、私は値を取得します5004b。なぜそれが起こっているのですか?

を削除するsubstrと、5004b残りの部分が変化する間、パーツは一定のままになります。これにより、生成されるGUIDのエントロピーが大幅に減少していませんか?

4

5 に答える 5

5

uniqid()はmicrotime()に基づいており、最初は長い間同じになります。

私の提案は、5桁の長さのuniqidが必要な場合は、毎回か何かをインクリメントすることです。

于 2012-07-17T01:03:15.497 に答える
3

uniqid()あなたが完全な価値をとる場合にのみ機能します。最初の文字ではなく、最後の5文字を​​使用する方が理にかなっています。

$id = substr(uniqid(),-5);

ただし、わずか1秒後に、繰り返し値が表示されます。あなたは本当に完全を取るべきですuniqid()

于 2012-07-17T01:26:28.333 に答える
0

出力のエントロピーを増やすには、を使用できますuniqid('', true);。ドキュメントによると、これにより、「戻り値の最後に(結合された線形合同法を使用して)エントロピーが追加され、結果が一意になる可能性が高くなります」。

于 2012-07-17T01:23:24.697 に答える
0

一意のIDが必要な場合は、uniqid()を使用しないでください。これは、現在の時刻に基づいたIDのみを返すためです。コンピュータが十分に高速である場合、同じ値が何度も生成されます。

エントロピーを拡大する(2番目の引数として「true」を渡す)ことは役立ちますが、この関数に欠陥があるという事実を隠すことはできないため、スクリプトで複数回使用しないでください。

于 2014-04-04T11:45:38.050 に答える
0

substr(uniqid(rand()、1)、0,7)のようなものを使用できます。これにより、ランダムシードから一意のIDが生成されます。次に、それらをデータベースに保存する場合は、再度生成する前に、それらが存在するかどうかを確認する必要がある場合があります。次のようなことをします:

function idExists($id){
//query database and check if the id already exists
}
//then use this to generate
$id=null;
   do{
$id=substr(uniqid(rand(),1),0,7); 
}while(idExists($id));
//then you get your unique id here
于 2015-01-29T07:28:41.173 に答える