Можно ли использовать уникальную функцию в php? [Дубликат]

Если вы хотите остановить либо , если число 5 достигнуто, или собрано 10 элементов, в Java-9 добавлен метод Stream.takeWhile():

List<Integer> integer = Stream.generate(new Supplier<Integer>() {
    int i = 0 ;

    @Override
    public Integer get() {
        return ++i;
    }
}).takeWhile(j -> j < 5).limit(10).collect(Collectors.toList());
71
задан Dinah 1 November 2010 в 16:15
поделиться

5 ответов

Обновление, март 2014:

Во-первых, важно отметить, что uniqid является немного неправильным, поскольку он не гарантирует уникальный идентификатор.

В Документация по PHP :

ВНИМАНИЕ!

Эта функция не создает случайную или непредсказуемую строку. Эта функция не должна использоваться в целях безопасности. Использовать криптографически безопасную случайную функцию / генератор и криптографически защищенные хэш-функции для создания непредсказуемого безопасного идентификатора.

И

Эта функция не генерирует криптографически защищенные токены, в факт без каких-либо дополнительных параметров, возвращаемое значение мало отличается от microtime () . Если вам нужно генерировать криптографически безопасные маркеры, используйте openssl_random_pseudo_bytes () .


Установка большей энтропии в true генерирует более уникальное значение, однако время выполнения (хотя и в малой степени), согласно документам:

Если установлено значение TRUE, uniqid () добавит дополнительную энтропию (используя объединенный линейный конгруэнтный генератор) в конце возвращающее значение, что увеличивает вероятность того, что результат будет уникальным.

Обратите внимание на строку increases the likelihood that the result will be unique, а не на то, что гарантирует уникальность .

Вы можете «бесконечно» стремиться к уникальности, вплоть до точки и улучшать с помощью любого количества процедур шифрования, добавляя соли и т.п. - это зависит от цели.

Я бы рекомендовал посмотреть комментарии к основной теме PHP, в частности:

http://www.php.net/manual/en/function.uniqid.php#96898

http://www.php.net/manual/en/function.uniqid.php # 96549

http://www.php.net/manual/en/function.uniqid.php#95001

Что я «Рекомендую выработать , почему вам нужна уникальность, это для безопасности (т. е. добавить в процедуру шифрования / скремблирования)? Кроме того, Как уникально это нужно? Наконец, посмотрите на скорость рассмотрения. Пригодность изменится с учетом основных соображений.

34
ответ дан think123 19 August 2018 в 12:08
поделиться
  • 1
    Самый важный урок с этими комментариями функций состоит в том, что uuid сам по себе является очень опасным идентификатором для передачи в виде файла cookie / readable ID, но в качестве локального / защищенного уникального идентификатора он имеет некоторые полезные возможности, а именно скорость. 2,5 цента. – DrPerdix 1 November 2010 в 16:26
  • 2
    Я не знаю, было ли это еще очевидным, но не используйте uniqid (или его производные) для чего-либо, связанного с безопасностью. PHP предлагает целый ряд криптобезопасных случайных генераторов, таких как: openssl_random_pseudo_bytes. Используйте подходящий инструмент для работы. – Halcyon 4 December 2013 в 18:01
  • 3
    Предполагая, что 2 файла не сохраняются в тот же микросекунда, временная метка unix microsecond будет уникальной для каждого файла. – CMCDragonkai 12 January 2014 в 19:01
  • 4
    Статистически маловероятно, что вы столкнетесь, но не невозможно. Поместите свое униидное поколение внутри do{} while(collision). Я использую этот подход при создании путей для загруженных файлов, например. – afilina 12 August 2015 в 14:04
  • 5
    Не знаю, почему был принят этот ответ. Уникальный! = Случайный / непредсказуемый – gadelat 19 May 2016 в 08:40

Вещи уникальны, если вы проверяете, что они уже не существуют. Не имеет значения, какую функцию вы используете для создания «случайной» строки или идентификатора, если вы не дважды проверяете, что это не дубликат, тогда всегда есть такая возможность.;)

В то время как uniqid основан на текущем времени, вышеописанная предостерегающая нота - все зависит от того, где вы будете использовать эти «уникальные идентификаторы». Подсказка ко всему этому заключается в том, где говорится «более уникально». Уникальный уникальный. Как вы можете иметь что-то более или менее уникальное, немного запутывает меня!

Проверяя, как указано выше, и объединяя все это, вы в конечном итоге получите что-то, приближающееся к уникальности, но все это относительно где будут использоваться ключи и контекст. Надеюсь, что это поможет!

15
ответ дан dmp 19 August 2018 в 12:08
поделиться
  • 1
    Существует огромная разница между «шансом получить столкновение - это одна из десяти тысяч». и «изменение получения столкновения меньше, чем у каждого пользователя программы, попадающего одновременно с помощью молнии». 128-битное значение, генерируемое хорошим RNG с хорошим семенем, настолько близко к тому, чтобы быть «действительно». что это не имеет значения, учитывая невероятно высокие затраты на получение чего-то provably (и непредсказуемо) уникального. – Michael Borgwardt 1 November 2010 в 16:20
  • 2
    Просто для продолжения вашей точки @ Майкл: для 128 бит вам понадобится каждый в США (300 миллионов), чтобы генерировать 1 миллион номеров в секунду всего на один день, чтобы получить 50-процентную вероятность столкновения ... Для 512 бит, вам понадобится каждый орган на земле (7 миллиардов человек), чтобы генерировать 1 триллион чисел в секунду каждый в течение следующих 10^47 лет, чтобы иметь 50% вероятность столкновения ... Так что да, с высоким большим достаточно верхняя граница случайного числа И достаточно хороший RNG, вы можете имитировать уникальность только с случайностью ... – ircmaxell 1 November 2010 в 16:35
  • 3
    Я полностью согласен с примерами вашего идеального мира, как указано выше. Шансы минимальны. Однако случайность не идеальна в реализациях, упомянутых в исходном вопросе, и я утверждаю, что домен, в котором используется этот уникальный номер, важен. Если у вас было 1000 серверов, каждый из которых делал «уникальный» идентификатор на основе микротрейб и предполагал, что они были уникальными »только потому, что», то в какой-то момент вы вполне можете сгореть. Невзирая на какие-либо причуды в коде .. ошибки или что-то еще. Здесь разница между реальностью и теорией, и именно поэтому мы проверяем;) – dmp 1 November 2010 в 16:58
  • 4
    «Принцип генерации небольших количеств конечной невероятности путем простого подключения логических схем Bembleweeny 57 Sub-Meson Brain к атомному векторному плоттеру, приостановленному в сильном броуновском двигателе (например, хорошая горячая чашка чая), конечно, понимать & Quot. – dmp 1 November 2010 в 16:58
  • 5
    @ircmaxell: Уловка состоит в том, что для этих чисел требуется реальная случайность и, следовательно, настоящий RNG. Вы даже не могли имитировать его с помощью PRNG с 128-битным внутренним состоянием, если у вас также не было возможности засеять его с помощью уникального / случайного & gt; 128-битного значения. Но это самая проблема, которую вы должны решить! И что-то меньшее, чем это, фактически гарантирует столкновения. Те же 300M люди, если они использовали свой дерьмовый запас компилятора rand(), имели бы вероятность 90% столкновения на самой первой итерации . Кроме того, если вам нужна > уникальность, даже 1001% вероятность столкновения слишком велика. – cHao 22 August 2013 в 14:13

Из обсуждений о функции на сайте PHP:

Как и другие ниже, без префикса и без «добавленной энтропии» эта функция просто возвращает отметку времени UNIX с добавленным счетчиком микросекунд как шестнадцатеричное число; это более или менее просто microtime () в форме hexit.

[...]

Также стоит отметить, что поскольку microtime () работает только с системами, имеющими gettimeofday ( )> присутствует, что Windows изначально НЕ ДЕЛАЕТ, uniqid () может дать только временную метку UNIX с однократным разрешением в среде Windows.

Другими словами, без «more_entropy» функция абсолютно ужасен и никогда не должен использоваться, период. Подписывая документацию, флаг будет использовать «объединенный линейный конгруэнтный генератор» для «добавления энтропии». Ну, это довольно слабый RNG. Поэтому я полностью пропустил эту функцию и использовал что-то, основанное на mt_rand , с хорошим семенем для вещей, не относящихся к безопасности, и SHA-256 для вещей, которые есть.

10
ответ дан Michael Borgwardt 19 August 2018 в 12:08
поделиться

Без флага more_unique он возвращает временную метку unix с микросекундным счетчиком, поэтому, если два вызова выполняются в одну и ту же микросекунду, тогда они вернут один и тот же «уникальный» идентификатор.

Оттуда вопрос о том, насколько это возможно. Ответ не очень, но не со скидкой. Если вам нужен уникальный идентификатор, и вы часто его генерируете (или работаете с данными, созданными в другом месте), не считайте его абсолютно уникальным.

6
ответ дан Reese Moore 19 August 2018 в 12:08
поделиться
  • 1
    верьте этому или нет, он на самом деле называет usleep (1), чтобы убедиться, что это никогда не произойдет! – Eli 22 July 2011 в 22:57
  • 2
    @Eli не уверен, что троллинг или нет, но это явно не так, потому что я получаю дубликаты, выполняющие это: for ($ i = 0; $ i & lt; 10; $ i ++) echo uniqid (). & Quot; \n & Quot ;; – djule5 16 July 2014 в 16:14
  • 3
    @ djule5 Нет, не троллинг: github.com/php/php-src/blob/… Возможно, вы используете очень старую версию PHP или на платформе для usleep не существует? – Eli 16 July 2014 в 21:05
  • 4
    @Eli интересный ха-ха спасибо за источник! Я запускаю PHP 5.5.11, но я нахожусь в Windows на этой машине dev ... так что, возможно, это объясняет! Таким образом, это определенно не так уникально для Windows, тогда ... – djule5 16 July 2014 в 23:25

Соответствующим битом из исходного кода является

if (more_entropy) {
    uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10);
} else {
    uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec);
}

Таким образом, more_entropy добавляет девять несколько случайных десятичных цифр ( php_combined_lcg() возвращает значение в (0,1)) - это 29,9 бит энтропии, вершины (на самом деле, вероятно, меньше, поскольку LCG не является криптографически надежным генератором псевдослучайных чисел).

3
ответ дан Tgr 19 August 2018 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: