Зачем в этой функции сдвиг?

Нашел на просторах инета функцию генерации UUID:
const uuid =()=>([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,c=>(c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4).toString(16));

Поясните работу. В частности зачем сдвиг? Ну и все остальное.

Чтобы было понятно - если бы я писал такую функцию, с таким же подходом, то у меня она выглядела бы примерно так:
const uuid =()=>([1e7]+-1e3+-1e3+-1e3+-1e11).replace(/[01]/g,()=>(crypto.getRandomValues(new Uint8Array(1))[0]&15).toString(16));

Хотя скорее всего вместо & вообще бы был модуль или XOR.
  • Вопрос задан
  • 310 просмотров
Решения вопроса 1
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
1) ([1e7]+-1e3+-4e3+-8e3+-1e11) - формируется строка "10000000-1000-4000-8000-100000000000"
2) .replace(/[018]/g,c= - пробегаемся по символам, и с каждым 0, 1 и 8 делаем что-то
3) 15 >> c/4 - 0,1,8 => 15,15,3
4) crypto.getRandomValues(new Uint8Array(1))[0] - случайное число 0..255
5) crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - побитовое И сужает 0..255 до 0..15 или 0..3 (если с=8)
6) c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - 0 или 1 или 8 XORятся с 5)
7) Что получилось - переводится в HEX и возвращается вместо символа

Сдвиг и XOR ( 3) и 6) ) вероятно нужны для большей энтропии, хотя работает и без этого.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы