Мне нужно на лету сгенерировать уникальные идентификационные номера с помощью javascript. Раньше я делал это, создавая число, используя время. Число будет состоять из четырехзначного года, двухзначного месяца, двухзначного дня, двухзначного часа, двухзначной минуты, двухзначной секунды и трехзначной миллисекунды. Это будет выглядеть примерно так: 20111104103912732 ... это даст достаточную уверенность в уникальном номере для моих целей.
Прошло много времени с тех пор, как я это сделал, а кода у меня больше нет. У кого-нибудь есть код для этого или есть лучшее предложение для создания уникального идентификатора?
javascript
time
numbers
unique
Ник Петри
источник
источник
new Date().toISOString ()
?Ответы:
Если вам просто нужен уникальный номер, тогда
даст вам простой номер. Но если вам нужна читаемая версия, вам придется немного поработать:
источник
new Date().getTime();
date.getUTCMilliseconds()
date.getTime()
function foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
The value returned by getUTCMilliseconds() is an integer between 0 and 999.
. Это худшая идея для уникального идентификатора, первый абзац следует удалить.Лучшим подходом было бы:
вместо того
valueOf () - «скорее всего» уникальное число. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
источник
+new Date()
valueOf()
. Я просто использую это -+performance.now().toString().replace('.', 7)
developer.mozilla.org/en-US/docs/Web/API/Performance/nowСамый короткий способ создать число, которое, как вы можете быть уверены, будет уникальным среди стольких отдельных экземпляров, о которых вы можете подумать, -
Если разница в вызове функции составляет 1 миллисекунду, то 100% гарантия сгенерирует другое число . Для вызовов функций в пределах одной и той же миллисекунды вы должны беспокоиться только в том случае, если вы создаете более нескольких миллионов чисел в пределах этой же миллисекунды, что маловероятно.
Подробнее о вероятности получения повторяющегося числа в течение той же миллисекунды см. Https://stackoverflow.com/a/28220928/4617597
источник
Этого можно добиться с помощью следующего кода:
источник
Вот что я делаю, когда мне нужно что-то меньшее, чем связка чисел, - меняю базу.
источник
(Date.now() + Math.random()).toString(36)
чтобы предотвратить конфликты миллисекунд. Он короткий и генерирует что-то вроде "k92g5pux.i36"Это работает быстрее, чем создание
Date
экземпляра, использует меньше кода и всегда дает уникальный номер (локально):jsfiddle: http://jsfiddle.net/j8aLocan/
Я опубликовал это на Bower и npm: https://github.com/stevenvachon/unique-number
Вы также можете использовать что-то более сложное, например cuid , puid или shorttid, чтобы сгенерировать нечисловое число.
источник
я использую
Так что, если по какой-то причине код запускается одновременно, есть небольшая вероятность, что случайные числа будут такими же.
источник
new Date()
это полезно. Вы можете получить одинаковые числа с двумя разными датамиMath.random()
?Это должно делать:
источник
если вам нужен уникальный номер через несколько миллисекунд, используйте
Date.now()
, если вы хотите использовать его внутри,for loop
то используйтеDate.now() and Math.random()
вместеуникальный номер внутри цикла for
output :: все числа уникальны
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
уникальный номер без
Math.random()
output :: Числа повторяются
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
источник
Изучая онлайн, я придумал следующий объект, который создает уникальный идентификатор для каждой сессии:
Кому-то это может быть полезно.
Ура
Андрей
источник
Это также должно делать:
источник
В ES6:
Пример:
источник
источник
В 2020 году вы можете использовать Crypto API в браузере для генерации криптографически стойких случайных значений.
как Uint8Array, так и Crypto.getRandomValues поддерживаются во всех основных браузерах, включая IE11.
источник
Размещение этого фрагмента кода здесь для моей будущей справки (не гарантировано, но достаточно "уникально"):
источник
Это создает почти гарантированно уникальный 32-символьный ключ на стороне клиента, если вы хотите, чтобы переменная "chars" изменялась только числами.
https://jsfiddle.net/j0evrdf1/1/
источник
используйте это: для создания уникального номера в javascript
Это действительно работает. :)
источник
Вызов 1: UniqueValue ('0')
Вызов 2: UniqueValue (UniqueValue ('0')) // будет сложным
Пример выходных данных:
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ('0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
35840116113248803
47430116113248803
41680113211803
47430116113248803
41680113211803 41680113211809
источник
Поскольку миллисекунды не обновляются каждую миллисекунду в узле, следующий ответ. Это создает уникальный читаемый человеком номер билета. Я новичок в программировании и nodejs. Пожалуйста, поправьте меня, если я ошибаюсь.
}
}
источник
Предполагая, что решение, предложенное @abarber , это хорошее решение, потому
(new Date()).getTime()
что он использует окна в миллисекунды и суммируетtick
в случае столкновений в этом интервале, мы могли бы рассмотреть возможность использования встроенного, как мы можем ясно видеть здесь в действии:Во-первых, здесь мы можем увидеть, как могут быть столкновения в оконной раме 1/1000, используя
(new Date()).getTime()
:Во-вторых, мы пробуем предложенное решение, позволяющее избежать коллизий в окне 1/1000:
Тем не менее, мы могли бы рассмотреть возможность использования таких функций, как узел,
process.nextTick
который вызывается в цикле событий, как отдельный,tick
и это хорошо объяснено здесь . Конечно, в браузере нет,process.nextTick
поэтому мы должны понять, как это сделать. Эта реализация будет установитьnextTick
функцию в браузере , используя самые близкие функции ввода / вывода в браузере, которыеsetTimeout(fnc,0)
,setImmediate(fnc)
,window.requestAnimationFrame
. Как предлагается здесь, мы могли бы добавитьwindow.postMessage
, но я оставляю это читателю, так как он также нуждаетсяaddEventListener
в. Я изменил исходные версии модуля, чтобы здесь было проще:Итак, в окне 1/1000 имеем:
источник
Может быть, еще лучше было бы использовать getTime () или valueOf (), но таким образом он возвращает уникальный плюс понятный человеку номер (представляющий дату и время):
источник
источник
Легко и всегда получите уникальную ценность:
источник
Я сделал так
источник
источник
в отношении решения #Marcelo Lazaroni выше
возвращает такое число, как это 1567507511939.4558 (ограничено 4 десятичными знаками), и дает неуникальные числа (или коллизии) каждые 0,1%.
добавление toString () исправляет это
Date.now() + Math.random().toString()
возвращает «15675096840820.04510962122198503» (строка) и, кроме того, настолько «медленный», что вы никогда не получите «ту же» миллисекунду.
источник
источник
Используя
toString(36)
немного медленное, вот более быстрое и уникальное решение:источник
Чтобы получить уникальный номер:
Пример:
вы можете изменить длину, используя:
источник
простое решение, которое я нашел
var today = новая дата (). valueOf ();
console.log (сегодня);
источник