Разделение чисел на взаимно уникальные части
Мне необходима помощь в написании алгоритма разделения числа на взаимно уникальные числа. При этом каждое такое число так же может быть разделено ещё раз и так до какого-то предела. Числа позже могут быть соединены. Если все части учавствуют в соединении - то в итоге получится первоначальное число.
Первое что пришло в голову разделять числа побитово. Так, даже если у нас только это число, не важно первоначальное или уже разделённое/соединённое сколько-то раз, и о других частях мы не знаем - можем быть уверены что его части будут не только взаимо уникальны, но и уникальны относительно других частей. В пример приведу числа типа uint8_t.
Допустим есть одно число - 1:0xFF. При разделении получим 2 уникальных числа - 1:0xF0 и 2:0x0F. Если второе число разделить - получим 3 уникальных числа - 1:0xF0, 2:0x0C и 3:0x03. Если соединить числа 1 и 2 получим снова уникальные 1:0xFC и 2:0x03. И финальное соединение даст изначальное 1:0xFF.
Моя реализация заключается в создании таблицы из 256 значений каждой вариации разделения числа. Однако есть условности в виде того, масштабирования этого метода на типы uint32_t и uint64_t (в т.ч. uint128 и 256) в виде доп. итераций и проверок каждого байта на возможность разделения. Ведь, если в байте установлен только 1 бит - число не может быть разделено, однако если в последующих байтах тоже есть установленные биты - то уже можно.
Подскажите какой-то алгоритм, который поможет решить проблему (c99, x86, win-msvc, linux-gcc)
П.с.: Зачем это нужно(не обязательно к прочтению): Пишу контейнер для сообщений и передачи запросов в другие сервисы. Контейнер, при пересылке, передаётся целиком в другое место, что обеспечивает целостность данных выполнения сложного многосервисного запроса. При передаче из сервиса a в b асинхронного запроса, который не требует ответов получается 2 версии контейнера - один в сервисе a, другой в сервисе b. Контейнеры на момент передачи имеют одинаковую историю всех сообщений, но разное число (из этого вопроса). Далее контейнеры живут уже своей жизнью и наполняются другими сообщениями и/или разделяются/соединяются дальше. Если, после окончания работы, оба(или более) этих контейнера попадут в log сервис - мы сможем быть уверены что это не дубликаты какие-то и при их соединении получим полную историю обработки всех запросов со всех сервисов и сможем построить полное дерево этих сообщений со всеми ветками (да, похоже на git ветки). А число (из этого вопроса) поможет определить дошли ли все части до конца, нет ли дубликатов и прочего.
П.с.с.: Если есть другие идеи/предположения контроля целостности и уникальности сообщений и веток этих сообщений - прошу тоже поделиться, ведь возможно я придумываю велосипед.