Создайте уникальный номер со временем javascript
Мне нужно генерировать уникальные идентификационные номера на лету, используя javascript. Раньше я делал это, создавая число, используя время. Число будет состоять из четырехзначного года, двухзначного месяца, двухзначного дня, двухзначного часа, двухзначной минуты, двухзначной секунды и трехзначной миллисекунды. Таким образом, это выглядело бы примерно так: 20111104103912732... это обеспечило бы достаточную уверенность в уникальном количестве для моих целей.
Прошло некоторое время с тех пор, как я это сделал, и у меня больше нет кода. У кого-нибудь есть код для этого или есть лучшее предложение для создания уникального идентификатора?
Ответы
Ответ 1
Если вы просто хотите уникальное число, то
var timestamp = new Date().getUTCMilliseconds();
вы получите простое число. Но если вам нужна читаемая версия, вы можете немного обработать:
var now = new Date();
timestamp = now.getFullYear().toString(); // 2011
timestamp += (now.getFullMonth < 9 ? '0' : '') + now.getFullMonth().toString(); // JS months are 0-based, so +1 and pad with 0's
timestamp += (now.getDate < 10) ? '0' : '') + now.getDate().toString(); // pad with a 0
... etc... with .getHours(), getMinutes(), getSeconds(), getMilliseconds()
Ответ 2
Лучший подход:
new Date().valueOf();
вместо
new Date().getUTCMilliseconds();
valueOf() является "скорее всего" уникальным числом. http://www.w3schools.com/jsref/jsref_valueof_date.asp.
Ответ 3
Самый короткий способ создать число, которое вы можете быть уверенным, будет уникальным среди множества отдельных экземпляров, о которых вы можете думать,
Date.now() + Math.random()
Если в вызове функции есть разница в 1 миллисекунде, гарантировано 100% генерировать другое число. Для вызовов функций в пределах той же миллисекунды вы должны только начать беспокоиться, если вы создаете более нескольких миллионов номеров в течение той же миллисекунды, что не очень вероятно.
Подробнее о вероятности получения повторяющегося числа за одну и ту же миллисекунду см. fooobar.com/questions/95733/...
Ответ 4
Это может быть достигнуто просто с помощью следующего кода:
var date = new Date();
var components = [
date.getYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds()
];
var id = components.join("");
Ответ 5
Вот что я делаю, когда хочу что-то меньшее, чем пучок чисел, - измените базу.
var uid = (new Date().getTime()).toString(36)
Ответ 6
Это выполняется быстрее, чем создание экземпляра Date
, использует меньше кода и всегда создает уникальный номер (локально):
function uniqueNumber() {
var date = Date.now();
// If created at same millisecond as previous
if (date <= uniqueNumber.previous) {
date = ++uniqueNumber.previous;
} else {
uniqueNumber.previous = date;
}
return date;
}
uniqueNumber.previous = 0;
jsfiddle: http://jsfiddle.net/j8aLocan/
Я выпустил это на Bower и npm: https://github.com/stevenvachon/unique-number
Вы также можете использовать что-то более сложное, например cuid, puid или shortid для создания не номера.
Ответ 7
Я использую
Math.floor(new Date().valueOf() * Math.random())
Итак, если случайно код запускается одновременно, есть еще и вероятность того, что случайные числа будут одинаковыми.
Ответ 8
Из исследования онлайн я придумал следующий объект, который создает уникальный идентификатор за сеанс:
window.mwUnique ={
prevTimeId : 0,
prevUniqueId : 0,
getUniqueID : function(){
try {
var d=new Date();
var newUniqueId = d.getTime();
if (newUniqueId == mwUnique.prevTimeId)
mwUnique.prevUniqueId = mwUnique.prevUniqueId + 1;
else {
mwUnique.prevTimeId = newUniqueId;
mwUnique.prevUniqueId = 0;
}
newUniqueId = newUniqueId + '' + mwUnique.prevUniqueId;
return newUniqueId;
}
catch(e) {
mwTool.logError('mwUnique.getUniqueID error:' + e.message + '.');
}
}
}
Это может быть полезно некоторым людям.
Приветствия
Эндрю
Ответ 9
Это должно сделать:
var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970
Ответ 10
В ES6:
const ID_LENGTH = 36
const START_LETTERS_ASCII = 97 // Use 64 for uppercase
const ALPHABET_LENGTH = 26
const uniqueID = () => [...new Array(ID_LENGTH)]
.map(() => String.fromCharCode(START_LETTERS_ASCII + Math.random() * ALPHABET_LENGTH))
.join('')
Пример:
> uniqueID()
> "bxppcnanpuxzpyewttifptbklkurvvetigra"
Ответ 11
Это также должно делать:
(function() {
var uniquePrevious = 0;
uniqueId = function() {
return uniquePrevious++;
};
}());
Ответ 12
Публикация этого фрагмента кода здесь для моей собственной будущей справки (не гарантированная, но удовлетворительная "уникальная" ):
// a valid floating number
window.generateUniqueNumber = function() {
return new Date().valueOf() + Math.random();
};
// a valid HTML id
window.generateUniqueId = function() {
return "_" + new Date().valueOf() + Math.random().toFixed(16).substring(2);
};
Ответ 13
Это создает почти гарантированную уникальную клиентскую сторону с 32-символьным ключом, если вы хотите, чтобы только цифры меняли "var" var.
var d = new Date().valueOf();
var n = d.toString();
var result = '';
var length = 32;
var p = 0;
var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
for (var i = length; i > 0; --i){
result += ((i & 1) && n.charAt(p) ? '<b>' + n.charAt(p) + '</b>' : chars[Math.floor(Math.random() * chars.length)]);
if(i & 1) p++;
};
https://jsfiddle.net/j0evrdf1/1/
Ответ 14
function UniqueValue(d){
var dat_e = new Date();
var uniqu_e = ((Math.random() *1000) +"").slice(-4)
dat_e = dat_e.toISOString().replace(/[^0-9]/g, "").replace(dat_e.getFullYear(),uniqu_e);
if(d==dat_e)
dat_e = UniqueValue(dat_e);
return dat_e;
}
Вызов 1: UniqueValue ('0')
Вызов 2: UniqueValue (UniqueValue ('0'))//будет сложным
Пример вывода:
for (var я = 0; я <10; i++) {console.log(UniqueValue (UniqueValue ('0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804
Ответ 15
если вы хотите получить уникальное число через несколько миллионов секунд, тогда используйте Date.now()
, если вы хотите использовать его внутри for loop
тогда используйте Date.now() and Math.random()
вместе
уникальный номер внутри цикла for
function getUniqueID(){
for(var i = 0; i< 5; i++)
console.log(Date.now() + ( (Math.random()*100000).toFixed()))
}
getUniqueID()
вывод :: все числа уникальны
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
уникальный номер без Math.random()
function getUniqueID(){
for(var i = 0; i< 5; i++)
console.log(Date.now())
}
getUniqueID()
output :: Числа повторяются
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
Ответ 16
Предполагалось, что решение, предложенное @abarber, это хорошее решение, потому что использует (new Date()).getTime()
, поэтому оно имеет окна миллисекунд и суммирует a tick
в случае столкновений в этом интервале, мы могли бы рассмотреть возможность использования встроенного
мы можем ясно видеть здесь в действии:
Здесь мы можем видеть, как могут возникать столкновения в оконном кадре 1/1000 с помощью (new Date()).getTime()
:
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1155:1 1469615396590
VM1155:1 1469615396591
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1156:1 1469615398845
VM1156:1 1469615398846
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1158:1 1469615403045
VM1158:1 1469615403045
Во-вторых, мы попробуем предлагаемое решение, которое предотвращает столкновения в окне 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Это говорит о том, что мы могли бы использовать такие функции, как node process.nextTick
, который вызывается в цикле событий как один tick
, и он хорошо объяснил .
Конечно, в браузере нет process.nextTick
, поэтому мы должны понять, как это сделать.
В этой реализации будет установлена функция nextTick
в браузере, используя самые близкие функции для ввода-вывода в браузере setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Как было предложено здесь, мы могли бы добавить window.postMessage
, но я оставляю это читателю, так как ему также нужен addEventListener
. Я изменил исходные версии модулей, чтобы упростить здесь:
getUniqueID = (c => {
if(typeof(nextTick)=='undefined')
nextTick = (function(window, prefixes, i, p, fnc) {
while (!fnc && i < prefixes.length) {
fnc = window[prefixes[i++] + 'equestAnimationFrame'];
}
return (fnc && fnc.bind(window)) || window.setImmediate || function(fnc) {window.setTimeout(fnc, 0);};
})(window, 'r webkitR mozR msR oR'.split(' '), 0);
nextTick(() => {
return c( (new Date()).getTime() )
})
})
Итак, мы имеем в окне 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966
Ответ 17
используйте это: для создания уникального номера в javascript
var uniqueNumber=(new Date().getTime()).toString(36);
Это действительно работает.:)
Ответ 18
Возможно, еще лучше было бы использовать getTime() или valueOf(), но таким образом он возвращает уникальное и понятное человеку число (представляющее дату и время):
window.getUniqNr = function() {
var now = new Date();
if (typeof window.uniqCounter === 'undefined') window.uniqCounter = 0;
window.uniqCounter++;
var m = now.getMonth(); var d = now.getDay();
var h = now.getHours(); var i = now.getMinutes();
var s = now.getSeconds(); var ms = now.getMilliseconds();
timestamp = now.getFullYear().toString()
+ (m <= 9 ? '0' : '') + m.toString()
+( d <= 9 ? '0' : '') + d.toString()
+ (h <= 9 ? '0' : '') + h.toString()
+ (i <= 9 ? '0' : '') + i.toString()
+ (s <= 9 ? '0' : '') + s.toString()
+ (ms <= 9 ? '00' : (ms <= 99 ? '0' : '')) + ms.toString()
+ window.uniqCounter;
return timestamp;
};
window.getUniqNr();
Ответ 19
let now = new Date();
let timestamp = now.getFullYear().toString();
let month = now.getMonth() + 1;
timestamp += (month < 10 ? '0' : '') + month.toString();
timestamp += (now.getDate() < 10 ? '0' : '') + now.getDate().toString();
timestamp += (now.getHours() < 10 ? '0' : '') + now.getHours().toString();
timestamp += (now.getMinutes() < 10 ? '0' : '') + now.getMinutes().toString();
timestamp += (now.getSeconds() < 10 ? '0' : '') + now.getSeconds().toString();
timestamp += (now.getMilliseconds() < 100 ? '0' : '') + now.getMilliseconds().toString();
Ответ 20
Так как миллисекунды не обновляются каждую миллисекунду в узле, следующий ответ. Это генерирует уникальный читаемый человеком номер билета. Я новичок в программировании и nodejs. Пожалуйста, поправьте меня, если я ошибаюсь.
function get2Digit(value) {
if (value.length == 1) return "0" + "" + value;
else return value;
}
function get3Digit(value) {
if (value.length == 1) return "00" + "" + value;
else return value;
}
function generateID() {
var d = new Date();
var year = d.getFullYear();
var month = get2Digit(d.getMonth() + 1);
var date = get2Digit(d.getDate());
var hours = get2Digit(d.getHours());
var minutes = get2Digit(d.getMinutes());
var seconds = get2Digit(d.getSeconds());
var millSeconds = get2Digit(d.getMilliseconds());
var dateValue = year + "" + month + "" + date;
var uniqueID = hours + "" + minutes + "" + seconds + "" + millSeconds;
if (lastUniqueID == "false" || lastUniqueID < uniqueID) lastUniqueID = uniqueID;
else lastUniqueID = Number(lastUniqueID) + 1;
return dateValue + "" + lastUniqueID;
}
Ответ 21
Легко и всегда получаю уникальную ценность:
const uniqueValue = (new Date()).getTime() + Math.trunc(365 * Math.random());
**OUTPUT LIKE THIS** : 1556782842762
Ответ 22
Я сделал так
function uniqeId() {
var ranDom = Math.floor(new Date().valueOf() * Math.random())
return _.uniqueId(ranDom);
}
Ответ 23
function getUniqueNumber() {
function shuffle(str) {
var a = str.split("");
var n = a.length;
for(var i = n - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
return a.join("");
}
var str = new Date().getTime() + (Math.random()*999 +1000).toFixed() //string
return Number.parseInt(shuffle(str));
}
Ответ 24
в отношении решения #Marcelo Lazaroni выше
Date.now() + Math.random()
возвращает такое число, как этот 1567507511939.4558 (ограничено 4 десятичными знаками), и будет давать неуникальные числа (или коллизии) каждые 0,1%.
добавление toString() исправляет это
Date.now() + Math.random().toString()
возвращает "15675096840820.04510962122198503" (строка) и
Кроме того, он настолько "медленный", что вы никогда не получите "одинаковую" миллисекунду.