Последовательный UUID JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Последовательный UUID Java

Сообщение Anonymous »

Мне нужно использовать UUID для первичных ключей некоторых моих таблиц, поскольку они должны быть глобально уникальными в нескольких клиентских базах данных, и в какой-то момент некоторые данные необходимо будет объединить обратно.

Использование столбца VARCHAR(36) и генератора случайных чисел UUID версии 4 Java решает проблему, но проблема в том, что UUID не являются последовательными, поэтому это приведет к еще одной проблеме с индексами и вставляется особенно в некоторые большие таблицы (1+ миллион строк).

Я пытаюсь сгенерировать последовательный, но случайный UUID, заменяя наиболее значимые биты из UUID текущей меткой времени (в любом случае эти биты уже представляют метку времени). Я знаю, что в Интернете есть решения для этого, а именно COMB UUID, но, как ни странно, я не смог найти для него реализацию Java. Я думал, что это обычная проблема.

Я нашел интересную реализацию на C# здесь:
http://www.codeproject.com/Articles/388 ... e-database

Похожий подход сделает то, что мне нужно, но мне трудно преобразовать его в Java, поэтому, если кто-нибудь может мне помочь Я был бы признателен. Я думаю, что большинство проблем связано с прямым порядком байтов/младшим порядком байтов, поскольку я думаю, что Java всегда будет использовать обратный порядок байтов, а не тот, который используется в собственной ОС? Не совсем уверен, как с этим справиться.

Моя идея в основном та же: сгенерировать UUID с помощью UUID.randomUUID(), а затем заменить MSB полученного идентификатора на System.currentTimeMillis(). Я не уверен в одном: сколько байтов мне понадобится для этого, потому что я думаю, что мы можем представить текущую временную метку с помощью 6 байтов, а часть UUID, посвященная временной метке, использует 7,5 байтов:

Код: Выделить всё

time_low               = 4*
time_mid               = 2*
time_high_and_version  = 2* (1 byte for UUI algorithm version)
РЕДАКТИРОВАТЬ: Я ценю ответы, но, пожалуйста, поймите, что мой вопрос касается реализации вышеупомянутого алгоритма на Java, а не поиска другой альтернативы. Я понимаю, что есть несколько других возможностей, и та, которая упоминалась о включении идентификатора клиента, - это то, что я использовал в прошлом, но мне это решение не очень нравится, И оно не применимо к этому проекту в основном по двум причинам:
- Это может работать хорошо, когда количество клиентов известно, но это не так. Это означает, что мне нужно будет генерировать случайные идентификаторы для каждого клиента, чтобы сделать их максимально уникальными, это будет означать 36 символов для префикса идентификатора клиента. и еще немало для последовательной части, это означает, что первичные ключи длиной более 50 символов не являются хорошей идеей.
- Это не решит проблему, которую я пытаюсь решить, а именно наличие последовательных первичных ключей: как только вы начнете вставлять записи от разных клиентов в одну и ту же таблицу, вставки больше не будут последовательными, и вы пострадаете в производительности.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»