Частично, хорошая идея?

Мне нужно генерировать и хранить идентификатор для каждой строки в распределенной базе данных (высокая пропускная способность записи). Существуют ограничения на длину идентификатора, предпочитая, чтобы он был как можно меньшим. Идентификатор должен быть в utf8.

Я думал о создании uuidv4, преобразовании в кодировку base16, удалении дефисов и принятии частичного подмножества символов, и в будущем, если нам потребуется больше символов, мы возьмем больший частичный подмножество.

например, Uuid = 123e4567-e89b-12d3-a456-426655440000

Подмножество = 123e4567e89b

Есть ли предсказуемые проблемы с этим?

2 ответа

Решение

Вы не можете гарантировать, что частичные UUID будут универсально уникальными. Теперь, в зависимости от количества сгенерированных UUID, это может не быть проблемой, особенно если вы проверяете наличие дубликатов... но, возможно, лучше просто написать собственный генератор идентификаторов с нужной вам спецификацией длины. Я предполагаю, что фактическая спецификация для UUID требует, чтобы определенное количество битов для каждого считалось универсально уникальным, но ваши требования ограничивают длину. Они не требуют использования фактических UUID.

Если ваше поле должно иметь значение для текста и длины, то использование base16 дает вам только 4 бита на байт, тогда как base64 дает 6 бит на байт. Другими словами, первому требуется на 50% больше байтов для достижения той же вероятности столкновения, что и второму. Вы можете получить ~7 бит на байт, воспользовавшись преимуществами работы UTF-8, но это намного больше работы (и риска) для гораздо меньшего выигрыша.

Однако нет смысла использовать усеченный UUID; Вы должны использовать все это, иначе его свойства предотвращения столкновений не сохранятся. Если вы просто хотите получить случайную строку, особенно если у вас есть возможность проверить наличие коллизий, просто сгенерируйте случайное число с желаемым количеством битов (предпочтительно, кратным 6), а затем base64 закодируйте его.

Другие вопросы по тегам