1. ホーム
  2. php

uniqidはどのようにユニークなのですか?

2023-09-01 09:41:11

質問

この質問は、本当に解決策を探している問題ではなく、もっと単純な好奇心の問題なのです。 PHP の uniqid 関数には、出力を "よりユニークにするための more entropy フラグがあります。 more_entropyがtrueのときとそうでないときで、この関数が同じ結果を2回以上出す可能性はどのくらいあるのだろうかと疑問に思ったのです。 言い換えれば、more_entropyが有効なときと無効なときで、uniqidはどのくらい違うのでしょうか? more_entropyを常に有効にしておくことの欠点はありますか?

どのように解決するのですか?

2014年3月更新。

まず、重要なのは uniqid は一意な ID を保証しないので、少し誤った呼び方です。

につきまして PHP ドキュメント :

警告!

この関数はランダムな文字列や予測不可能な文字列を生成するものではありません。この この関数は、セキュリティのために使用してはいけません。暗号学的に安全な 安全なランダム関数/ジェネレータと暗号的に安全なハッシュ関数を使用してください。 を使用してください。

そして

この関数は暗号的に安全なトークンを生成しません。 実際、追加のパラメータを渡さなければ、返り値は とはほとんど変わりません。 microtime() . 暗号化された安全なトークンを生成する必要がある場合は 暗号化された安全なトークンを生成する必要がある場合は openssl_random_pseudo_bytes() .


ドキュメントによると、more-entropy を true に設定すると、よりユニークな値が生成されますが、実行時間が長くなります (程度はごくわずかですが)。

TRUEに設定された場合、uniqid()は追加のエントロピーを(結合線形合同生成器を使用して)追加します。 を使用した) 追加のエントロピーを返り値の末尾に追加します。 を追加し、結果が一意である可能性を高めます。

行に注目してください。 increases the likelihood that the result will be unique であり、それではなく、意志 保証する の一意性を保証するものではありません。

一意性のために、ある点までは「無限に」努力することができ、任意の数の暗号化ルーチンを使って強化することができ、さらに などを使用して強化することができます - それは目的に依存します。

特にPHPのメイントピックのコメントを見てみることをお勧めします。

http://www.php.net/manual/en/function.uniqid.php#96898

http://www.php.net/manual/en/function.uniqid.php#96549

http://www.php.net/manual/en/function.uniqid.php#95001

私がお勧めするのは、体を鍛えることです。 なぜ セキュリティのため(つまり、暗号化/スクランブルルーチンに追加するため)なのか?また どのように 一意である必要があるのでしょうか? 最後に、速度の検討を見てください。適性は根本的な検討事項で変わってきます。