Как сформировать уникальный идентификатор для нескольких потоков и сессий
От: .alex Ниоткуда  
Дата: 16.02.23 14:42
Оценка:
Добрый день.

Подскажите какие есть практики для формирования УИД при добавлении записей в БД одновременно из нескольких независимых потоков ну и в несколько сессий «заливки».
Постараюсь объяснить подробнее.
Есть, например, 100 xml файлов, моя программа читает их, например, одновременно в 10 потоков (1 поток – 1 файл) и соответственно каждый поток делает bulkinsert в общую таблицу в БД.
И нужно сделать УИД для каждой записи в формате bigint (составной УИД не подходит, т.к. в последствии этот УИД будет использоваться для построения полнотекстового индекса по данной таблице).

Я делал так: из 8 байт bigint я использовал 5 младших байт, как счетчик текущей записи в текущем файле (в одном файле записей может быть больше 2^32 но меньше 2^40),
а в 3 старших засовывал crc32, посчитанную по строке, которая состоит из имени файла + переведенный в строку размер фала (это на случай не уникальности имен файлов, комбинация имя + размер – уникально),
ну и из-за того, что у меня всего 3 байта для crc32 я два оставлял как есть а для 3 и 4 делал xor и добавлял в оставшийся байт bigint.

В принципе все работало, но если в загрузке участвует несколько тысяч файлов, то моей доморощенной crc32 стало не хватать, появились коллизии…
Так вот собственно вопрос, что можно придумать, притом без хранения информации о предыдущей сессии?
Если бы не было несколько сессий «заливки», то понятно перед заливкой каждому потоку даем свой ИД и льем, но как быть в второй и последующих сессиях заливки, от чего отталкиваться, время я тоже не придумал, как засунуть в 3 байта…
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.