Контекст
Веб-приложение, PHP 5, MySQL 5.0.91
Проблема
Недавно я переключился с использования автоинкрементного целого числа на UUID в качестве первичного ключа для некоторые из моих таблиц. При генерации UUID с помощью функции MySQLUUID()
они очень похожи друг на друга:
| 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 (как указано выше), который не соответствует спецификации?
Ограничения
Примечания