1

番号順として使用するトークン/キーを作成する必要があるため、これは一意である必要があり、トークンは「6X990742MG185953R」のようなものである必要があるため、バーコードのように使用できます。http://barcodes4.me/barcode/c128b/6X990742MG185953R.png

UUID や GUID は長すぎるため使用できません。近いほど次のようになります。

function uuid64() {
 $uuid = uuid(); // some UUID v4
 $byteString = "";
 $uuid = str_replace("-", "", $uuid);
 for($i = 0; $i < strlen($uuid); $i += 2) {
  $s = substr($uuid, $i, 2);
  $d = hexdec($s);
  $c = chr($d);
  $byteString = $byteString.$c;
 } 

 $b64uuid = base64_encode($byteString);
 // Replace the "/" and "+" since they are reserved characters
 $b64uuid = str_replace("/", "_", $b64uuid);
 $b64uuid = str_replace("+", "-", $b64uuid);
 // Remove the trailing "=="
 $b64uuid = substr($b64uuid, 0, strlen($b64uuid) - 2); 

 return $b64uuid;
}

4

4 に答える 4

5

質問は、あなたが正確に何を望んでいるのかについてあまり明確ではありません。そのような文字列をランダムに生成したい場合は、次のようにすることができます:

$length = 20;
$characters = ‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’;
$random_string = "";    
for ($p = 0; $p < $length; $p++) {
    $random_string .= $characters[mt_rand(0, strlen($characters))];
}

新しく生成されたトークンが一意であることを確認するには、以前に生成されたすべてのトークンを追跡し、チェックを実行する必要があります。

于 2010-03-04T08:00:43.653 に答える
3

私はあなたがあなたの最後のコメントで質問に答えたと思います、はい、あなたのデータベースから直接UIDを生成します自動インクリメントID +塗りつぶし文字、例えば

function uid($n) {
    $id_part = base_convert($n, 10, 36);
    $rand_part = str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789');
    return sprintf("%05s%.15s", $id_part, $rand_part);
}

これにより、ベースが5文字のUIDが作成されます-36のプライマリID+15のごみ文字

于 2010-03-04T09:50:23.263 に答える
0

この関数を見つけました。tinyurl のスタイルのようなトークンを返します

function gen_uuid($len = 8)
{
    $hex = md5("some_salt_please" . uniqid("", true));
    $pack = pack('H*', $hex);
    $uid = base64_encode($pack);
    $uid = ereg_replace("[^A-Z0-9]", "", strtoupper($uid));
    if ($len<4)
        $len=4;
    if ($len>128)
        $len=128;
    while (strlen($uid)<$len)
        $uid = $uid . gen_uuid(22);
    return substr($uid, 0, $len);
}

于 2010-03-04T08:49:49.380 に答える
0

短い一意の ID が必要な場合は、以前のすべての ID を保持するためのデータベースが必要です。

while (true)
{
    $prefix = "";
    $mid = $prefix . rand(100000,999999) . chr(rand(65, 90));
    $check = mysql_query("SELECT id FROM ids WHERE id = '$mid'");
    if (mysql_num_rows($check) != 0)
    {
        //duplicate
    }
    else
    {
        mysql_query("insert into ids VALUES('$mid')");
        break 1;
    }
}
于 2010-03-04T08:55:31.863 に答える