КонтекстЗамените функцию UUID версии 1 MySQL?
веб-приложений, PHP 5, MySQL 5.0.91
Проблема
Я недавно перешел от использования автоинкрементных целого числа в UUID в качестве первичного ключа для некоторых моих таблиц. При генерации UUID с помощью UUID()
функции MySQL, они очень похожи друг на друга:
| 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 символов идентичны для одного и того же пользователя. Это было предназначено, но не нужно.
Вопрос
Есть ли предпочтительный/рекомендуемый способ для создания версии 4 или 5 UUID в запросе MySQL?
Если нет, допустимо ли создавать пользовательский UUID в PHP (как указано выше), который не соответствует спецификации?
Ограничения
- Я использую общий план хостинга с доступом из командной строки, но не может изменить существующую установку MySQL.
- Я бы предпочел избегать сторонних пакетов/библиотек.
Примечания
- я и не будет выполнять слияние, синхронизацию, или другие операции, требующие GUID, который содержит адрес MAC. Это не проблема.
Только для нижних лучше, почему вы перестали использовать автоматические номера и подумали ли вы о создании своего рода SHA? Кроме того, существует UUID_SHORT() –
@MatthewRiches: 'UUID_SHORT()' недоступен в MySQL 5.0.X (я уточнил версию в своем вопросе). Я решил переключиться с автоматически увеличивающегося целого числа после чтения http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html. –
В качестве побочного элемента: «если MAC-адрес никогда не изменяется, большая часть UUID бесполезна и тратится впустую», это неверно, хэш-адрес MAC-адреса имеет решающее значение, если вы хотите выполнять многосерверную синхронизацию. –