Ваши UUID выше имеют длину 32 шестнадцатеричных числа. Это означает, что у вас есть 16 ^ 32 ≈ 3.4e38 возможных UUID. Простым решением было бы использовать большую библиотеку int (или собственный метод) для хранения этих очень больших значений как фактических чисел. Затем вы можете просто поделить число возможных UUID на N (назовите это значение k), дав вам границы сегмента 0, k, 2 * k, ... (N-1) * k, UMAX.
Это приводит к проблеме, если N не делит число возможных UUID. Очевидно, что не все сегменты будут иметь одинаковое количество UUID, но в этом случае они даже не будут равномерно распределены. Например, если число возможных UUID равно 32, и вы хотите 7 сегментов, тогда k будет равно 4, поэтому у вас будут сегменты размером 4, 4, 4, 4, 4, 4 и 8. Это, вероятно, не ' т идеал. Чтобы исправить это, вместо этого вы можете установить границы сегмента в 0, (1 * UMAX) / N, (2 * UMAX) / N, ... ((N-1) * UMAX) / N, UMAX. Затем в вышеописанном неудобном случае вы получите границы 0, 4, 9, 13, 18, 22, 27, 32 - с размерами сегментов 4, 5, 4, 5, 4, 5, 5.
Вероятно, вам понадобится большая библиотека int или какой-либо другой метод для хранения больших целых чисел, чтобы использовать этот метод. Для сравнения, long long в C ++ (в некоторых реализациях) может хранить только до 2 ^ 64 ≈ 1.8e19.