Что делает этот генератор псевдо-GUID лучше, чем math.random ()? - PullRequest
3 голосов
/ 29 октября 2011

Я нашел вопрос здесь:

Создать GUID / UUID в JavaScript?

Ответ дает следующий JS:

function S4() {
   return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}

function guid() {
   return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}

Теперь, некоторые из этого кажутся мне глупыми.Почему так много повторений?Я планировал использовать это для именования файлов, загружаемых на мой сервер, чтобы они не перекрывали друг друга.Это не похоже на то, что всегда будет генерироваться уникальный номер.

В чем преимущества приведенных выше кодов по сравнению с простым именованием файла math.random().Это даже не меняет семя.

Извините, я никогда не работал с GUID / UUID, и часть кода не имеет для меня никакого смысла ...

РАЗЪЯСНЕНИЕ

Многие люди не отвечают на вопрос так, как я его задал.Многие люди объясняют, что GUID не всегда уникален, бла-бла-бла.Это не то, что я спрашиваю.Я спрашиваю, какой смысл было использовать его всего за math.random().

Кажется, Джо дал мне лучший ответ в комментариях.

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Для примера, даже .NET GUID не «привязан» к машине. .NET использует v4 UUID для Guid.NewGuid() ( Простое доказательство того, что GUID не является уникальным ), поэтому 122 бита случайности плюс 6 фиксированных битов. Читая здесь Возможны ли коллизии GUID? кажется, что SQL Server использует полное случайное число (но у меня нет SQL Server для проверки ... проверено ... Кажется, используется тот же формат v4. Существует «фиксированная» 4, и следующий «блок» всегда начинается с 8, 9, A, B. Таким образом, 122 бита случайности).

Итак, что у вас за проблема с этим генератором случайных чисел, который выдает 128 бит случайности в формате "ноу"? Вы бы предпочли видеть 128-битное число нефиксированного формата? Вот Это Да! Очень практично ... Здесь ... Возьмите один 43438471087229589138546501885363994076 (это GUID, преобразованный в его числовое значение, основание 10). Теперь, как бы вы хотели сохранить это сделать вашу любимую базу данных? VARCHAR или NUMERIC? Не проще ли упаковать его в GUID?

Как знак ... Какое преимущество перед math.random()? Что ж ... По поводу однократного использования math.random() вполне понятно :-) Я не знаю, сколько битов случайности имеет один вызов math.random, но при максимуме это 63 бита (число в JS равно 64 биты, но 1 бит для знака). И, вероятно, много много меньше.

1 голос
/ 29 октября 2011

Даже этот ответ говорит: «Вы хотите фактические идентификаторы GUID или просто случайные числа, которые выглядят как идентификаторы GUID?» Потому что это не настоящие GUID. Также из оригинального потока: «В Javascript нет способа генерировать реальные GUID, потому что они зависят от свойств локального компьютера, которые браузеры не предоставляют». поэтому мой вопрос: вам нужен GUID? Или просто случайное имя файла? В GUID для потребителя нет ничего волшебного, дело не в том, как он выглядит, а в том, как он генерируется. Для случайного имени файла использование тактов + случайное число будет (хотя бы как) эффективным ...

В вашем случае нет причин. Но если у вас есть код JS, который говорит с чем-то, что ожидает GUID или что-то в этой форме, вам нужно будет передать что-то похожего формата, поскольку вы не можете сгенерировать реальную вещь в чистом JS.

...