Мне очень нравится, насколько чистый ответ Бровафа , но, к сожалению, плохие реализации Math.random
оставляют шанс для столкновения.
Вот аналогичное решение, совместимое с RFC4122 версии 4, которое решает эту проблему, компенсируя первые 13 шестнадцатеричных чисел шестнадцатеричной частью метки времени. Таким образом, даже если Math.random
находится на одном семестре, оба клиента должны будут генерировать UUID в то же самое миллисекунду (или через 10 000 лет позже), чтобы получить тот же UUID:
function generateUUID() { // Public Domain/MIT
var d = new Date().getTime();
if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
shuffle имеет аргумент reshuffle_each_iteration, который можно установить на False, чтобы перетасовка происходила только в 1-ю эпоху, а состояние поддерживалось в будущих эпохах.