ホームページ  >  記事  >  バックエンド開発  >  PHP で UUID を生成する正しい方法は何ですか?

PHP で UUID を生成する正しい方法は何ですか?

WBOY
WBOYオリジナル
2016-12-01 00:56:292110ブラウズ

オンラインで検索すると、一般的に次のようなものであることがわかりました。

リーリー リーリー

UUID の説明を読んだ後、これらの生成方法の影響率が基準を満たしていないように感じたのはなぜですか?

返信内容:

オンラインで検索すると、一般的に次のようなものであることがわかりました。

リーリー リーリー

UUID の説明を読んだ後、これらの生成方法の影響率が基準を満たしていないように感じたのはなぜですか?

現在、UUID を生成するための多くのいわゆる PHP メソッドは、アルゴリズムの基礎として乱数を使用していますが、実際に反復する機会を持つことは困難ですが、理論的には明らかに不可能です。

ここではMongoDbのObjectIdを例に挙げていますが、この生成方法はPHPにも導入できるのではないかと個人的に感じています。
ObjectId は主にタイムスタンプ、ミリ秒、マシンコード、自動インクリメント数の 4 つの部分に分かれています。

最初の 2 つについて詳しく説明する必要はありません。PHP は入手できます。焦点は後の 2 つです。

マシンコードは主に、異なるホスト間で同じ UUID が生成されるのを避けるために使用されます。
現在の機械語生成の主流はハードウェア情報に基づくハッシュ計算であり、この方法はPHPには適していません。
主な理由は 2 点あり、1 つは PHP がハードウェア情報を直接取得できないこと (ローカル コマンドの拡張や実行が必要など)、もう 1 つは PHP リクエスト間でデータを共有できないため、各リクエストはマシン コードをプルする必要があることです。パフォーマンスへの影響は非常に大きいです。
この問題を解決する非常に簡単な方法があります。それは、最初に異なるマシンでマシンコードを計算し、それを構成ファイルに直接書き込み、PHP 処理中にそれを直接読み取ることです。

自動インクリメント数は主に、同時処理で同じ UUID が生成されるのを避けるために使用されます。
自動インクリメントの場合、PHP はリクエスト間でデータを共有できないため、自動インクリメントのカウントを直接実装できません。
この問題を解決するには、PHP の 2 つの拡張機能、つまりセマフォと共有メモリを導入できます。どちらも PHP ソース コードに統合されており、--enable-sysvsem および --enable-sysvshm を通じて開くことができます。自動インクリメント番号を共有メモリに配置し、セマフォを介したアクセスを制限するだけで、自動インクリメント テクノロジを共有するという同時リクエストの目的を達成できます。もちろん、自己インクリメントは他のツールを通じても実現できます。

Linux カーネルは、UUID 生成インターフェイスを提供します。
cat /proc/sys/kernel/random/uuid
どのプログラムであっても、ファイルを読み取ることで UUID を取得できます。

独自の価値を自分で生成:openssl_random_pseudo_bytes リーリー

さらに、 🎜 を使用すると、適切なランダム文字列を生成することもできるようです: 🎜 リーリー
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。