Создайте уникальный номер со временем javascript

Мне нужно генерировать уникальные идентификационные номера на лету, используя javascript. Раньше я делал это, создавая число, используя время. Число будет состоять из четырехзначного года, двухзначного месяца, двухзначного дня, двухзначного часа, двухзначной минуты, двухзначной секунды и трехзначной миллисекунды. Таким образом, это выглядело бы примерно так: 20111104103912732... это обеспечило бы достаточную уверенность в уникальном количестве для моих целей.

Прошло некоторое время с тех пор, как я это сделал, и у меня больше нет кода. У кого-нибудь есть код для этого или есть лучшее предложение для создания уникального идентификатора?

+89
источник поделиться
24 ответа

Если вы просто хотите уникальное число, то

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()
+59
источник

Лучший подход:

new Date().valueOf();

вместо

new Date().getUTCMilliseconds();

valueOf() является "скорее всего" уникальным числом. http://www.w3schools.com/jsref/jsref_valueof_date.asp.

+100
источник
другие ответы

Связанные вопросы


Похожие вопросы

Самый короткий способ создать число, которое вы можете быть уверенным, будет уникальным среди множества отдельных экземпляров, о которых вы можете думать,

Date.now() + Math.random()

Если в вызове функции есть разница в 1 миллисекунде, гарантировано 100% генерировать другое число. Для вызовов функций в пределах той же миллисекунды вы должны только начать беспокоиться, если вы создаете более нескольких миллионов номеров в течение той же миллисекунды, что не очень вероятно.

Подробнее о вероятности получения повторяющегося числа за одну и ту же миллисекунду см. fooobar.com/questions/95733/...

+49
источник

Это может быть достигнуто просто с помощью следующего кода:

var date = new Date();
var components = [
    date.getYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds()
];

var id = components.join("");
+21
источник

Вот что я делаю, когда хочу что-то меньшее, чем пучок чисел, - измените базу.

var uid = (new Date().getTime()).toString(36)
+15
источник

Это выполняется быстрее, чем создание экземпляра 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 для создания не номера.

+15
источник

Я использую

Math.floor(new Date().valueOf() * Math.random())

Итак, если случайно код запускается одновременно, есть еще и вероятность того, что случайные числа будут одинаковыми.

+12
источник

Из исследования онлайн я придумал следующий объект, который создает уникальный идентификатор за сеанс:

        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 + '.');
            }
        }            
    }

Это может быть полезно некоторым людям.

Приветствия

Эндрю

+4
источник

Это должно сделать:

var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970
+4
источник

В 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"
+3
источник

Это также должно делать:

(function() {
    var uniquePrevious = 0;
    uniqueId = function() {
        return uniquePrevious++;
    };
}());
+2
источник

Публикация этого фрагмента кода здесь для моей собственной будущей справки (не гарантированная, но удовлетворительная "уникальная" ):

// 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);
};
+1
источник

Это создает почти гарантированную уникальную клиентскую сторону с 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/

+1
источник
    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

+1
источник

если вы хотите получить уникальное число через несколько миллионов секунд, тогда используйте 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

+1
источник

Предполагалось, что решение, предложенное @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
0
источник

используйте это: для создания уникального номера в javascript

var uniqueNumber=(new Date().getTime()).toString(36);

Это действительно работает.:)

0
источник

Возможно, еще лучше было бы использовать 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();
0
источник
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();
0
источник

Так как миллисекунды не обновляются каждую миллисекунду в узле, следующий ответ. Это генерирует уникальный читаемый человеком номер билета. Я новичок в программировании и 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;
}
0
источник

Легко и всегда получаю уникальную ценность:

const uniqueValue = (new Date()).getTime() + Math.trunc(365 * Math.random());
**OUTPUT LIKE THIS** : 1556782842762
0
источник

Я сделал так

function uniqeId() {
   var ranDom = Math.floor(new Date().valueOf() * Math.random())
   return _.uniqueId(ranDom);
}
0
источник
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));   
}
0
источник

в отношении решения #Marcelo Lazaroni выше

Date.now() + Math.random()

возвращает такое число, как этот 1567507511939.4558 (ограничено 4 десятичными знаками), и будет давать неуникальные числа (или коллизии) каждые 0,1%.

добавление toString() исправляет это

Date.now() + Math.random().toString()

возвращает "15675096840820.04510962122198503" (строка) и  Кроме того, он настолько "медленный", что вы никогда не получите "одинаковую" миллисекунду.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос