php generate unique uid solution 詳細
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の関連コンテンツは、スクリプトハウスの過去記事を検索するか、下記の関連記事を引き続き閲覧してください。
関連
-
WeChatの小さなプログラムは、ログイン後に携帯電話番号を取得するためにThinkPHP5の承認と組み合わせます。
-
thinkphp6でmysqlの悲観的ロックを使って商品の売れ残り問題を解決するための実装
-
phpでファイルがアップロードされない場合の解析例と解決策
-
Thinkphpが無効化された機能をバイパスするプロジェクト
-
学生の成績を取得するためのPHPメソッド
-
php セキュリティ 攻撃 世界 unserialize 関数 デシリアライズ 例 詳細
-
Laravelで認証を使用するとトップページにジャンプする問題を解決
-
AliCloudのossファイルアップロード機能をlaravelで実装した例
-
オンデマンドアップロードを実現するLaravelフレームワーク Aliyun機能
-
laravelのユーザーのパスワード変更とメールボックスの結合の詳細操作
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン