次の12個の数値形式で一意の識別子を生成したい:
YYYYMMDDXXXX
例:
201403052318
どこ:
YYYYMMDDは現在の日付値であり、他のXXXXはランダムに生成された値です。
$today = date("Ymd");
$Rand = sprintf("%04d", Rand(0,9999));
$unique = $today . $Rand;
1日に必要な一意のボリュームは約100です。PHPを使用する方法を使用して、Rand値の重複を防止したり、すべてのIDを一意にしたりする必要がありますか?現在の時刻関数を使用して、これらの数値を最後に圧縮することができます。 4文字?
編集:テーブルの素数インデックスとしてMySQLデータベースに接続された一意の値。データベースに保存されている情報とは関係のない初期値です。
Rand()
に依存することはできません。重複が生成される可能性があります(Rand(0,9999)
が重複を生成することは非常にまれですが、ある時点で発生します)。
したがって、Rand()
に移動する代わりに、増分値(たとえば、1から開始)を作成し、生成された日付に追加します。
次回新しいIDを再生成するときは、その増分値のステータス(たとえば、どこかに保存した場合は1つ正しい必要がありますか?)を取得し、増分して新しい日付に追加します。
uniqid
を_sha-1
_およびtime
と組み合わせて使用し、最初の4文字に対してsubstr()
を実行できます。
_<?php
$today = date("Ymd");
$Rand = strtoupper(substr(uniqid(sha1(time())),0,4));
echo $unique = $today . $Rand;
_
_OUTPUT :
_
_201403094B3F
_
私は似たようなことをする必要がありました。時間を保ち、IDを一意に保つソリューションで、最終的にPHP
functiontime()
likeを使用するソリューションになりました。この
$reference_number = 'BFF-' . time()
; BFF
を、ビジネスロジックにとってより意味のあるものに変更できます。
私の一意の参照IDはBFF-1393327176
のように見え、番号はUnixからリアルタイムに変換できます。これによりTue, 25 Feb 2014 11:19:36
が得られます。
これがお役に立てば幸いです
一意の値が1回生成された場合は、Rand値を条件付きで選択し、その値を配列に格納する必要があります。配列は、-using inarray になります。 =-:
$amount = 100; // the amount of ids
$previousValues = array();
for ($i = 0; $i < $amount; $i++){
$Rand = Rand(0,9999);
while (in_array($Rand, $previousValues)){
$Rand = Rand(0, 9999);
}
$previousValues[] = $Rand;
$today = date("Ymd");
$unique = $today.$Rand;
echo $unique."\n";
}
チェックアウト this demo。