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

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

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

Ответы [ 21 ]

98 голосов
/ 05 августа 2013

Лучшим подходом будет:

new Date().valueOf();

вместо

new Date().getUTCMilliseconds();

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

57 голосов
/ 04 ноября 2011

Если вам просто нужен уникальный номер, тогда

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()
44 голосов
/ 14 ноября 2016

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

Date.now() + Math.random()

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

Подробнее о вероятности получения повторного числа в течение одной миллисекунды см. https://stackoverflow.com/a/28220928/4617597

23 голосов
/ 04 ноября 2011

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

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

var id = components.join("");
15 голосов
/ 07 марта 2015

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

15 голосов
/ 26 февраля 2015

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

var uid = (new Date().getTime()).toString(36)
12 голосов
/ 01 ноября 2016

Я использую

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

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

4 голосов
/ 21 сентября 2014

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

var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970
4 голосов
/ 16 января 2014

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

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

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

Приветствия

Andrew

3 голосов
/ 10 апреля 2018

В 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"
...