1. ホーム
  2. Web プログラミング
  3. PHP プログラミング
  4. phpの例

php generate unique uid solution 詳細

2022-01-14 06:44:04

I. ユニークなuuidを生成する

uuid を使ってユーザーの uid を置き換える人がいるようです。

コードから、ミリ秒単位のタイムスタンプを前置した文字を生成した後にmd5暗号化することで、ユニークな

そしてセパレータで分割してuuidを取得します。

この方法は、uidの重複をかなり避けることができますが

しかし、生成されたuidは36文字と長すぎ、英語と数字記号が混在しており、とても読めません

そして、一般的なuidは純粋な数値で構成されている

<?php
function generateUUid($strtoupper = false)
{
    $charid = call_user_func($strtoupper ? 'strtoupper' : 'strtolower', md5(uniqid(microtime(true), true)));
    $hyphen = chr(45);
    $uuid = substr($charid, 0, 8) . $hyphen . substr($charid, 8, 4) . $hyphen . substr($charid, 12, 4) . $hyphen . . substr($charid, 16, 4) . $hyphen . substr($charid, 20, 12);
    return $uuid;
}
 
//result: 37f14a07-cb18-2e54-4e40-da1e2fa0456d

<スパン II. 一意の uid を生成する

通常のuidは純粋な数字であることが多いので

また、一意性を確保するために、必然的にタイムスタンプと関連付ける必要があるため、以下のようなコードになります。

同じ秒数の間にできるだけ多くの異なるidを持つ人を登録するために、ランダムソートのためにタイムスタンプを乱すのは悪いアイディアではありません

しかし、文字をスクランブルすることで重複を修正することはできますが、uidの長さが固定で変更できないことがデメリットです

しかし、絶対はないので、ランダムな衝突により、本当にuidが同じだったらどうするか

安全のために、やはりデータベースクエリを行う必要があります。

データベースへのI/Oプレッシャーを大幅に増加させる

<?php
function generateUid()
{
    return call_user_func('str_shuffle', time());
}
 
// result: 4067524162

<スパン III. 一意の uid を生成する正しい方法

上記の2つの方法は、望ましくないというわけではありませんが

が、大企業では必ずしも望ましくないということです。一つは、uidのフォーマットが必然的に純粋な数値になるため、uuidのアプローチは除外されます

また、データベースへの負荷の関係で、必ずしも2番目の方法が使われるとは限りません。

最も頻繁に使用される方法は、データベースの主キーインデックスを使用することで、必然的に一意である

ここで多くの人が疑問に思うのは、主キーのインデックスは1から始まり、このuidは1桁になるのではないかということです。

小さな、小さなパターンですが、主キーインデックスのオフセットを100000から始まるように設定すれば、問題は解決するのではないでしょうか。

このとき、誰かが、"主キー・インデックスの増加には、自身を1ずつ増加させるものを挿入するなどのパターンがないのか、と尋ねます

この時、主キーインデックスが1以外のステップで成長するように設定します。

また、uid をより非相関に見せるために、ステップのサイズを 3 のような基本値に設定することができます。

これは、100000, 100003, 100006, 100009, 100012 ...と成長していく。

補足

phpで標準的なuuidを生成する方法

UUIDとは、あるマシンで生成された番号で、同じ時空のすべてのマシンに対して一意であることが保証されているものです。

多くのプラットフォームでは、UUIDを生成するAPIが提供されており、イーサネットカードのアドレス、ナノ秒の時間、チップIDコード、その他多くの可能な数字を用いて、オープンソフトウェア財団(OSF)が定めた標準に従って計算されています。

現在の日付と時刻(UUIDの最初の部分は時間に依存します。UUIDを生成して数秒後に別のものを生成すると、最初の部分は異なり、残りの部分は同じになります)、時計列、グローバルにユニークなIEEEマシン識別番号(NICが持っていればそこから取得、持っていなければそれ以外)、ユニークUUIDの組み合わせです。欠点は、生成結果の文字列が長くなることです。

この規格のUUIDで最もよく使われているのは、マイクロソフトのGUID(Globals Unique Identifiers)です。

UUIDは、ColdFusionのCreateUUUID()関数で非常に簡単に生成できます。形式は、 xxxxxxx-xxxx-xxxxxx- xxxxxxxxxxxx(8-4-4-16) で、各xは0-9またはa-fの範囲内の16進数です。

また、標準的なUUIDの形式は、xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx (8-4-4-12)です。

<?php

function guid(){
 if (function_exists('com_create_guid')){
  return com_create_guid();
 }else{
  mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
  $charid = strtoupper(md5(uniqid(rand(), true)));
  $hyphen = chr(45);// "-"
  $uuid = chr(123) // "{"
    .substr($charid, 0, 8). $hyphen
    .substr($charid, 8, 4). $hyphen
    .substr($charid, 12, 4). $hyphen
    .substr($charid,16, 4). $hyphen
    .substr($charid,20,12)
    .chr(125);// "}"
  return $uuid;
 }
}
echo guid();
? >

phpでユニークなuidを生成する問題の解決方法については、この記事にまとめています。phpの関連コンテンツは、スクリプトハウスの過去記事を検索するか、下記の関連記事を引き続き閲覧してください。