Заменить функцию MySQL UUID версии 1?

Контекст

Веб-приложение, 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 (как указано выше), который не соответствует спецификации?

Ограничения

  • Я использую план общего хостинга с доступом из командной строки, но не могу изменить существующую установку MySQL.
  • Я бы предпочел избегать сторонних пакетов/библиотек.

Примечания

  • Я не выполняю и не буду выполнять слияние, синхронизацию или другие операции, для которых требуется идентификатор GUID, содержащий MAC-адрес. Дело не в этом.

12
задан Evan Mulawski 20 June 2012 в 15:57
поделиться