Создайте уникальный номер со временем javascript - PullRequest
82 голосов
/ 04 ноября 2011

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

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

Ответы [ 21 ]

2 голосов
/ 17 августа 2015

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

(function() {
    var uniquePrevious = 0;
    uniqueId = function() {
        return uniquePrevious++;
    };
}());
1 голос
/ 21 сентября 2016
    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 <10; i ++) {console.log (UniqueValue (UniqueValue ('0')));}60950116113248802267801161132488035392011611324880335840116113248803474301161132488034168011611324880342980116113248804347501161132488042095011611324880403730116113248804 </p>

1 голос
/ 19 августа 2016

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

// 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 голос
/ 31 августа 2016

Это создает почти гарантированную уникальную 32-символьную клиентскую сторону ключа, если вы хотите, чтобы числа меняли "chars" 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/

0 голосов
/ 02 мая 2019

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

const uniqueValue = (new Date()).getTime() + Math.trunc(365 * Math.random());
**OUTPUT LIKE THIS** : 1556782842762
0 голосов
/ 06 июня 2019

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

output :: все числа уникальны

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

0 голосов
/ 21 октября 2018

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

Возможно, даже лучше было бы использовать 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 голосов
/ 27 июля 2016

Предполагается, что решение, предложенное @ abarber , является хорошим решением, поскольку использует (new Date()).getTime(), поэтому у него есть окна в миллисекундах и сумма 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

Тем не менее, мы могли бы рассмотреть возможность использования таких функций, как узел 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
...