Создайте уникальный номер с помощью javascript time
Мне нужно генерировать уникальные идентификационные номера "на лету" с помощью JavaScript. В прошлом я делал это, создавая число, используя время. Число будет состоять из четырех цифр года, двух цифр месяца, двух цифр дня, двух цифр часа, двух цифр минуты, двух цифр секунды и трех цифр миллисекунды. Так что это будет выглядеть примерно так: 20111104103912732 ... это дало бы достаточно уверенности в уникальном числе для моих целей.
Это было время, так как я сделал это, и я у меня больше нет кода. У кого-нибудь есть код для этого, или есть лучшее предложение для создания уникального идентификатора?
18 ответов:
Если вы просто хотите уникальное число, то
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()
лучше:
new Date().valueOf();вместо
new Date().getUTCMilliseconds();valueOf () это" скорее всего " уникальное число. http://www.w3schools.com/jsref/jsref_valueof_date.asp.
самый короткий способ создать число, которое вы можете быть уверены, будет уникальным среди стольких отдельных экземпляров, как вы можете думать о
Date.now() + Math.random()если есть 1 миллисекундная разница в вызове функции, это 100% гарантированно генерировать другое число. Для вызовов функций в течение той же миллисекунды вы должны только начать беспокоиться, если вы создаете более нескольких миллионов номеров в течение этой же миллисекунды, что не очень вероятный.
для получения дополнительной информации о вероятности получения повторяющегося числа в течение той же миллисекунды см. https://stackoverflow.com/a/28220928/4617597
Это может быть достигнуто просто с помощью следующего кода:
var date = new Date(); var components = [ date.getYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds() ]; var id = components.join("");
это работает быстрее, чем создание
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 to создать номер.
вот что я делаю, когда я хочу что - то меньшее, чем куча чисел-изменить базу.
var uid = (new Date().getTime()).toString(36)
Я использую
Math.floor(new Date().valueOf() * Math.random())поэтому, если случайно код запускается в то же время, есть также крошечный шанс, что случайные числа будут одинаковыми.
из исследования в Интернете я придумал следующий объект, который создает уникальный идентификатор за сеанс:
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 + '.'); } } }Это может быть полезно для некоторых людей.
Ура
Андрей
Это нужно делать:
(function() { var uniquePrevious = 0; uniqueId = function() { return uniquePrevious++; }; }());
размещение этого фрагмента кода здесь для моей собственной будущей ссылки (не гарантируется, но удовлетворительно "уникальный" достаточно):
// 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); };
Это создает почти гарантированную уникальную 32-символьную ключевую клиентскую сторону, если вы хотите просто изменить номера "символов" 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++; };
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 i =0;i 60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804
в 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"
предполагается, что решение, предложенное @abarber это хорошее решение, потому что использует
(new Date()).getTime()так что у него есть окна миллисекунд и сумма atickв случае столкновений в этом интервале, мы могли бы рассмотреть возможность использования встроенного в качестве мы можем ясно видеть здесь в действии:кулак мы можем видеть здесь, как могут быть столкновения в 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тем не менее, мы могли бы рассмотреть возможность использования таких функций, как узел
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
используйте это:для создания уникального номера в javascript
var uniqueNumber=(new Date().getTime()).toString(36);Это действительно работает. :)
может быть, даже лучше было бы использовать 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();
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();
Comments