Создайте уникальный номер с помощью javascript time



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



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

822   18  

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

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

Ура

Андрей

Это :

var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970

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

(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++;
};

https://jsfiddle.net/j0evrdf1/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 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() так что у него есть окна миллисекунд и сумма 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

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

    Ничего не найдено.