Skip to content

Instantly share code, notes, and snippets.

@sshmyg
Created September 5, 2020 15:32
Show Gist options
  • Save sshmyg/0551da90a09f14d100c5b1e6350ee689 to your computer and use it in GitHub Desktop.
Save sshmyg/0551da90a09f14d100c5b1e6350ee689 to your computer and use it in GitHub Desktop.
Простой способ генерации символьных ID и UUID

Source: https://tech.geekjob.ru/prostoy-sposob-generacii-id-uuid/

На JavaScript Если вдруг нужно быстро сгенерить символьные ID, которые представляют собой сочетание цифр и символов, при этом вам не нужна высокая надежность и коллизии вам не страшны, то можно сделать это очень быстро следующим образом:

const id = f${(~~(Math.random()*1e8)).toString(16)}; // Result: f5d47a64 Можно так же сделать генерацию хешей от времени:

const id = f${(+new Date).toString(16)}; // f161807f6409 Только не стоит использовать такой подход для генерации сесионных ID и прочих секурных дел. Такое может пригодится, если нужно заполнить что-то рандомными значениями, сгенерить объект с рандомными ключами и так далее.

Генерация UUID UUID (universally unique identifier) — это стандарт идентификации, используемый в создании программного обеспечения, стандартизированный Open Software Foundation. Основное назначени— позволить распределённым системам уникально идентифицировать информацию без центра координации. Наиболее распространённым использованием данного стандарта является реализация Globally Unique Identifier (GUID).

UUID представляет собой 16-байтный (128-битный) номер. В шестнадцатеричной системе счисления UUID выглядит как:

d29e9b42-9b97-ab6f-bc0c-2c3f938d10e4 Общее количество уникальных ключей UUID составляет 2128 = 25616 или около 3,4 × 1038. Это означает, что генерируя 1 триллион ключей каждую наносекунду, перебрать все возможные значения удастся лишь за 10 миллиардов лет.

Собственно теперь вопрос, как сгенерить данную строку на JS. Вариант реализации:

const uuid =()=>'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,(c,r)=>('x'==с?(r=Math.random()*16|0):(r&0x3|0x8)).toString(16)); Но такой код не криптостойкий и есть вероятность коллизии, так как Math.random() может вести себя детерменировано (особенно если вас посетил гугл бот. Пруф: http://www.tomanthony.co.uk/blog/googlebot-javascript-random/)

Для уменьшения коллизийи и улучшения криптонадежности можно использовать Crypto API:

const uuid =()=>([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,c=>(c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4).toString(16)); Код ([1e7]+-1e3+-4e3+-8e3+-1e11) формирует строку "10000000-1000-4000-8000-100000000000". Далее .replace(/[018]/g - пробегаемся по символам, и с каждым 0, 1 и 8 производим манипуляции. Затем сдвиг: 15 >> c/4 - 0,1,8 => 15,15,3 после чего вызываем crypto.getRandomValues(new Uint8Array(1))[0] - генерим случайное число в диапазоне 0..255. Вызов crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - это не что иное как побитовое И, этот код сужает диапазон 0..255 до 0..15 или 0..3, если с=8. Вызов c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - ноль или один, или 8 черех XOR обрабатываются с предыдущим шагом. Полученный результат переводим в шестнадцатеричный формат и возвращаем вместо символа. Сдвиг и xor в данном коде нужны для большей энтропии.

Генерация GUID GUID — это разновидность UUID и его особенность заключается в формате. Так что при необходимости не составит труда переделать формат функции под GUID.

UUID and GUID

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment