На 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