语境
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 ?
如果不是,是否可以在 PHP(如上)中生成不符合规范的自定义 UUID?
限制
- 我正在使用具有命令行访问权限的共享主机计划,但无法修改现有的 MySQL 安装。
- 我宁愿避免使用第三方包/库。
笔记
- 我不会也不会执行合并、同步或其他需要包含 MAC 地址的 GUID 的操作。这不是这里的问题。