Знаю вопрос криво звучит, попытаюсь объяснить на пальцах.
Есть 2 хранилки, в обе нужно укладывать данные по некоторым сущностям. Часть данных по каждой сущности попадает в одну систему, часть в другую. Необходимо организовать возможность объединить данные для требуемой сущности.
Идея генерировать уникальный ключ и хранить его в обеих системах. Хотели использовать GUID. Но возникла проблема - одна из систем использует в качестве первичного ключа только int64. GUID -128 бит.
Есть ли какая-нибудь возможность генерировать уникальный int64?
Пытался все обобщить, в итоге плохо написал. Первая система - это Oracle. И будет не 1 сервер, а несколько. Ключ нужно генерировать уникальным на уровне всех серверов, а не конкретной машины. По этой причине банальный авто инкремент не подойдет.
1. составной ключ - первый ключ - ID сервера, второй сам LONG.
2. разделите LONG на количество серверов - получите шаг.
первый сервер будет генерировать с 0 до ШАГА-1
второй сервер генерирует с ШАГ до ШАГ*2-1
и т.д.
задать начало и конец генерации поля можно в настройкой конкретной таблицы.
в MS SQL знаю как. в Oracle не работал. но такое тоже есть там 100%.
ваши LONG значения не будут пересекаться между серверами.
Генерируешь GUID и берёшь для него остаток от деления на 64 битное простое число. Или ксоришь первые 64 бита со вторыми 64 битами (но тут возможны конфликты уже).
becks: Если брать остаток от деления на простое число, то вероятность коллизий ооооочень низкая. С учётом того, что GUID всего вдвое больше остатка, то на практике вероятность коллизий почти нулевая. Главное, чтобы делитель 65 битным был простым числом, тогда остаток будет 64 бита.
GUID и сам-то не гарантирует строгой уникальности в целом, только в определенной замкнутой системе. Ну и к примеру для шардинга всё куда как проще может быть. Если знаете какое хранилище использовать, то спокойно заводите счетчик для каждого хранилища и выставляете нужное кол-во старших бит, чтобы точно идентифицировать нужную ноду. В вашем случае всего 1 бит. Или даже грубо можно использовать знаковое число, для одной ноды плюсовать от 1, для другой минусовать от -1.
Если сущностей меньше миллиона, то можно просто генерировать random int64 - шансы на коллизию - меньше 1 к 10 000 000. Я бы поставил на противоположное ;) Подробнее