PHPで5文字のuniqidを次のように生成しています。
$id = substr(uniqid(),0,5);
そして、私がそれを呼び出すたびに、私は値を取得します5004b
。なぜそれが起こっているのですか?
を削除するsubstr
と、5004b
残りの部分が変化する間、パーツは一定のままになります。これにより、生成されるGUIDのエントロピーが大幅に減少していませんか?
PHPで5文字のuniqidを次のように生成しています。
$id = substr(uniqid(),0,5);
そして、私がそれを呼び出すたびに、私は値を取得します5004b
。なぜそれが起こっているのですか?
を削除するsubstr
と、5004b
残りの部分が変化する間、パーツは一定のままになります。これにより、生成されるGUIDのエントロピーが大幅に減少していませんか?
uniqid()はmicrotime()に基づいており、最初は長い間同じになります。
私の提案は、5桁の長さのuniqidが必要な場合は、毎回か何かをインクリメントすることです。
uniqid()
あなたが完全な価値をとる場合にのみ機能します。最初の文字ではなく、最後の5文字を使用する方が理にかなっています。
$id = substr(uniqid(),-5);
ただし、わずか1秒後に、繰り返し値が表示されます。あなたは本当に完全を取るべきですuniqid()
。
出力のエントロピーを増やすには、を使用できますuniqid('', true);
。ドキュメントによると、これにより、「戻り値の最後に(結合された線形合同法を使用して)エントロピーが追加され、結果が一意になる可能性が高くなります」。
一意のIDが必要な場合は、uniqid()を使用しないでください。これは、現在の時刻に基づいたIDのみを返すためです。コンピュータが十分に高速である場合、同じ値が何度も生成されます。
エントロピーを拡大する(2番目の引数として「true」を渡す)ことは役立ちますが、この関数に欠陥があるという事実を隠すことはできないため、スクリプトで複数回使用しないでください。
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