Контекст
Веб-приложение, PHP 5, MySQL 5.0.91
Проблема
Недавно я переключился с использования автоинкрементного целого на UUID в качестве первичного ключа для некоторых моих таблиц. При генерации UUID через MySQL UUID()
они очень похожи друг на друга:
| uuid |
----------------------------------------
| 1e5988da-afec-11e1-9877-5464f7aa6d24 |
| 408092aa-afad-11e1-9877-5464f7aa6d24 |
^------^ ^^
1 8 11-12
Как вы можете видеть, только первые 8 символов, а 11 и 12 - разные. Я понимаю, что в UUID версии 1 используется метка времени и аппаратный MAC-адрес для генерации UUID. Тем не менее, я не решаюсь использовать версию 1 из-за этих сходств (и того факта, что MAC-адрес в моем случае никогда не изменится). Кроме того, если MAC-адрес никогда не изменяется, большая часть UUID бесполезна и тратит впустую пространство.
Моя пользовательская функция UUID
В качестве эксперимента я написал пользовательский UUID-генератор в PHP:
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 символов идентичны для одного и того же пользователя. Это было предназначено, но не нужно.
Вопрос
Есть ли предпочтительный/рекомендуемый способ создания UUID Версии 4 или Версии 5 в запросе MySQL?
Если нет, допустимо ли генерировать пользовательский UUID в PHP (как указано выше), который не соответствует спецификации?
Ограничения
- Я использую общий план хостинга с доступом к командной строке, но не могу изменить существующую установку MySQL.
- Я бы предпочел избегать сторонних пакетов/библиотек.
Примечания
- Я не выполняю и не выполняю слияние, синхронизацию или другие операции, для которых требуется GUID, содержащий MAC-адрес. Это не проблема.