本文目录导读:

在PHP中判断UUID的版本,可以通过分析UUID字符串的特定位置来实现,UUID的版本信息存储在第13个字符(索引12)的位置。
UUID结构简要说明
UUID格式:xxxxxxxx-xxxx-Vxxx-xxxx-xxxxxxxxxxxx
V位置即为版本号(第13个字符)
判断UUID版本的代码示例
<?php
/**
* 获取UUID的版本号
* @param string $uuid UUID字符串
* @return int|null 返回版本号(1-8),无效UUID返回null
*/
function getUuidVersion(string $uuid): ?int
{
// 验证UUID格式
$pattern = '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i';
if (!preg_match($pattern, $uuid)) {
return null;
}
// 获取版本号(第13个字符,索引12)
$versionChar = $uuid[12];
$version = hexdec($versionChar);
// 版本号范围1-8
if ($version >= 1 && $version <= 8) {
return $version;
}
return null;
}
// 测试示例
$uuids = [
'550e8400-e29b-41d4-a716-446655440000', // v4
'f47ac10b-58cc-4372-a567-0e02b2c3d479', // v4
'6ba7b810-9dad-11d1-80b4-00c04fd430c8', // v1
'00000000-0000-3000-8000-000000000000', // v3
'00000000-0000-5000-8000-000000000000', // v5
];
foreach ($uuids as $uuid) {
$version = getUuidVersion($uuid);
echo "UUID: $uuid\n";
echo "版本: " . ($version !== null ? "v$version" : "无效") . "\n\n";
}
更简洁的单行判断
<?php
/**
* 快速获取UUID版本号(不验证格式)
*/
function quickUuidVersion(string $uuid): ?int
{
if (strlen($uuid) !== 36) {
return null;
}
$version = hexdec($uuid[14]); // 注意:部分实现使用索引14
return ($version >= 1 && $version <= 8) ? $version : null;
}
常见UUID版本特征
| 版本 | 第13个字符 | 说明 |
|---|---|---|
| v1 | 1 | 基于时间+MAC地址 |
| v2 | 2 | DCE安全版本 |
| v3 | 3 | 基于MD5哈希 |
| v4 | 4 | 随机生成 |
| v5 | 5 | 基于SHA-1哈希 |
| v6 | 6 | 基于时间的重新排序 |
| v7 | 7 | 基于时间戳+随机 |
| v8 | 8 | 自定义生成 |
完整验证函数
<?php
/**
* 验证UUID并返回详细信息
*/
function validateUuid(string $uuid): array
{
$result = [
'valid' => false,
'version' => null,
'variant' => null,
'error' => null
];
// 基本格式验证
$pattern = '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i';
if (!preg_match($pattern, $uuid)) {
$result['error'] = 'Invalid UUID format';
return $result;
}
// 获取版本号
$versionChar = $uuid[14];
$version = hexdec($versionChar);
if ($version < 1 || $version > 8) {
$result['error'] = "Invalid version: $version";
return $result;
}
$result['valid'] = true;
$result['version'] = $version;
$result['variant'] = ($uuid[19] === '8' || $uuid[19] === '9' ||
$uuid[19] === 'a' || $uuid[19] === 'b') ? 'RFC 4122' : 'Other';
return $result;
}
注意事项
- 索引位置:UUID字符串中版本号位于第14个字符(索引13或14,取决于实现)
- 大小写:UUID通常为小写,但验证时应不区分大小写
- 格式验证:始终先验证UUID格式,再获取版本号
- 性能优化:如果仅需版本号,可以使用字符串索引而非正则表达式
这个实现可以帮助你准确判断任何UUID字符串的版本号,并进行有效的验证。