10

uniqid()関数は、13桁の長さの16進数を返します。php.netサイトの仕様によると、関数はmicrotime一意の値を生成するために使用します。

ただしmicrotime、次のように文字列形式で数値を返します。

"0.70352700 12689396875"

これは基本的にマイクロ秒と1970年から経過した秒数です。これは9+11桁の10進数です。

10進数の20を16進数に変換すると、13桁ではなく16桁の16進数になります。

「0」も出そうと思いました。決して変わらないように見える部分、および常に「00」のままであるように見えるマイクロ秒部分の最後の2桁。これを行うと、10進数の長さは9 + 11-3桁になりますが、16進数に変換したときに17桁の10進数は、13ではなく14桁の16進数になります。

別の方法で一意のIDを取得したり、より長い/短い一意のIDを取得したりすることに興味はありません。私は誰かがなぜuniqidが13桁しか返さないのかを知っているかどうかだけを尋ねています。

意味がないようです。uniqid戻り値が。より1桁少ない場合はmicrotimemicrotime、。によって返された結果よりも一意の結果が得られることを意味しuniqidます。

4

4 に答える 4

20

これはhttp://www.php.net/manual/en/function.uniqid.php#95001で見つかりました

私には理にかなっています。説明が必要な場合はコメント

記録として、uniqid()の基礎となる関数は、おおよそ次のように見えます。

$ m = microtime(true); sprintf( "%8x%05x \ n"、floor($ m)、($ m-floor($ m))* 1000000);

つまり、最初の8つの16進文字= Unixtime、最後の5つの16進文字=マイクロ秒です。これがマイクロ秒の精度を持っている理由です。また、uniqidが生成された時刻をリバースエンジニアリングする手段を提供します。

date( "r"、hexdec(substr(uniqid()、0,8)));

文字列をさらに下に行くと、10 ^ 6の違いにより、数字の普及率が0..3> 4> 5..fである数字9を除いて、数字は時間の経過とともに「より一意」になります。および16^5(これはおそらく残りの数字にも当てはまりますが、それほど目立たなくなります)。

于 2010-03-18T20:00:04.840 に答える
8

によって生成される数値は、マイクロ秒単位の現在の時刻に基づいていると思いますが、uniqidその時刻ではありません。計算は、おそらく少し難しいと思います。

それでも、13桁を超える数字が必要な場合はtrue、2番目のパラメーターとしてに渡しuniqidてエントロピーを増やすことができます。これにより、23文字の長さの文字列が得られます。


たとえば、コードのこの部分では:

var_dump(uniqid());
var_dump(uniqid('', true));

私はちょうど得た:

string '4ba284384e4ca' (length=13)
string '4ba284384e4df9.73439132' (length=23)
于 2010-03-18T19:50:50.443 に答える
2

32文字の一意のIDの場合は、次のことを試してください。

$unique = uniqid(rand(), true);

短くするには、substr()を使用します。

$unique = substr(uniqid(rand(), true), 16, 16); // 16 characters long
于 2010-03-18T19:55:45.623 に答える
-3

PHPのマニュアルによると、デフォルトは13で、$ more_entropyがtrueに設定されていると、23になりますが、常にUnixタイムスタンプになります。

よく使う$uid = md5( uniqid() );

更新:
これにより、このライフタイムで衝突の可能性を最小限に抑えて32文字が得られます。

md5(uniqid(mt_rand(), true)); 
于 2010-03-18T19:56:45.920 に答える