Вы можете использовать доморощенную функцию UUID, которая гарантированно будет уникальным псевдослучайным целым числом в диапазоне [0 ... 2 128 ).Ниже приведен пример, основанный на линейном конгенциальном генераторе .Константы взяты из здесь или здесь .Вам нужно только держать предыдущий номер / UUID под рукой, чтобы сгенерировать следующий, нет необходимости проверять, потому что он будет повторяться только после полного периода 2 128 .
Код зависит от BigInt,протестировано с узлом v12
const a = 199967246047888932297834045878657099405n; // should satisfy a % 8n = 5n
const c = 1n; // should be odd
const m = (1n << 128n);
const mask = m - 1n;
function LCG128(state) {
return (BigInt(state) * a + c) & mask; // same as % m
}
q = 7654321n; // seed
q = LCG128(q);
q.toString(16); // first UUID
q = LCG128(q);
q.toString(16); // second UUID
q = LCG128(q);
q.toString(16); // third UUID
ОБНОВЛЕНИЕ
Просто чтобы быть более философским в данном вопросе:
- Вы можете считать UUID4 черным ящиком иповерьте - это то, что @ChrisWhite предложил
- Вы можете считать UUID4 черным ящиком и не доверять ему - это то, что вы предложили проверить в списке или ответить @ KevinPastor
- Сделайте свой собственныйпрозрачная коробка, которая производит числа в нужном диапазоне и быть уникальной - это мое предложение
Красота подхода LCG заключается в том, что, учитывая хороший множитель и перенос, он уникально и обратимый диапазон карт [0 ...2 128 ) в себя (это может быть сделано для 64-разрядных чисел, с различными a
, c
или 32-разрядными числами и т. Д. И т. Д.).Вы даже можете использовать счетчик в качестве входных данных, начиная с 0 до 2 128 -1, и он будет генерировать неповторяемые числа в том же диапазоне, заполняя все [0 ... 2 128 ),Таким образом, вы знаете, что если вы связываете его с предыдущим uuid или используете счетчик, то вероятность столкновения равна 0.