Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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()

Ответ 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" (строка) и  Кроме того, он настолько "медленный", что вы никогда не получите "одинаковую" миллисекунду.