環境
Web アプリケーション、PHP 5、MySQL 5.0.91
問題
最近、一部のテーブルの主キーとして、自動インクリメント整数の使用から UUID の使用に切り替えました。MySQL のUUID()
関数を介して UUID を生成する場合、それらは互いに非常に似ています。
| uuid |
----------------------------------------
| 1e5988da-afec-11e1-9877-5464f7aa6d24 |
| 408092aa-afad-11e1-9877-5464f7aa6d24 |
^------^ ^^
1 8 11-12
ご覧のとおり、最初の 8 文字と 11 番目と 12 番目の文字だけが異なります。UUID バージョン 1 がタイムスタンプとハードウェア MAC アドレスを使用して UUID を生成することを理解しています。ただし、これらの類似点 (および私の場合は MAC アドレスが変更されないという事実) のために、バージョン 1 の使用をためらっています。さらに、MAC アドレスが変更されない場合、ほとんどの UUID は役に立たず、スペースを浪費しています。
私のカスタム UUID 関数
実験として、PHP でカスタム UUID ジェネレーターを作成しました。
public static function GenerateUUID()
{
return
substr(sha1(Account::GetUsername() . Account::GetUserID()), 18, 8) . "-" .
substr(md5(time()), rand() % 28, 4) . "-" .
substr(md5(date("Y")), rand() % 28, 4) . "-" .
substr(sha1(rand()), 20, 4) . "-" .
substr(sha1(rand() % PHP_INT_MAX), 17, 12);
}
結果のサンプル:
| uuid |
----------------------------------------
| 574d18c2-5080-bac9-5597-45435f363ea1 |
| 574d18c2-30d4-8b5b-4ffd-001744d3d287 |
ここで、最初の 8 文字は同じユーザーの場合は同じです。これは意図されていましたが、必要ありませんでした。
質問
MySQL クエリ内でバージョン 4 またはバージョン 5 の UUID を生成する推奨/推奨方法はありますか?
そうでない場合、仕様に準拠しないカスタム UUID を (上記のように) PHP 内で生成することは許容されますか?
制限
- コマンドライン アクセスで共有ホスティング プランを使用していますが、既存の MySQL インストールを変更できません。
- サードパーティのパッケージ/ライブラリは避けたいと思います。
ノート
- MAC アドレスを含む GUID を必要とするマージ、同期、またはその他の操作は実行していません。それはここでは問題ではありません。