Если вы хотите остановить либо , если число 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());
Обновление, март 2014:
Во-первых, важно отметить, что uniqid
является немного неправильным, поскольку он не гарантирует уникальный идентификатор.
ВНИМАНИЕ!
Эта функция не создает случайную или непредсказуемую строку. Эта функция не должна использоваться в целях безопасности. Использовать криптографически безопасную случайную функцию / генератор и криптографически защищенные хэш-функции для создания непредсказуемого безопасного идентификатора.
blockquote>И
Эта функция не генерирует криптографически защищенные токены, в факт без каких-либо дополнительных параметров, возвращаемое значение мало отличается от microtime () . Если вам нужно генерировать криптографически безопасные маркеры, используйте openssl_random_pseudo_bytes () .
blockquote>
Установка большей энтропии в true генерирует более уникальное значение, однако время выполнения (хотя и в малой степени), согласно документам:
Если установлено значение TRUE, uniqid () добавит дополнительную энтропию (используя объединенный линейный конгруэнтный генератор) в конце возвращающее значение, что увеличивает вероятность того, что результат будет уникальным.
blockquote>Обратите внимание на строку
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
Что я «Рекомендую выработать , почему вам нужна уникальность, это для безопасности (т. е. добавить в процедуру шифрования / скремблирования)? Кроме того, Как уникально это нужно? Наконец, посмотрите на скорость рассмотрения. Пригодность изменится с учетом основных соображений.
Вещи уникальны, если вы проверяете, что они уже не существуют. Не имеет значения, какую функцию вы используете для создания «случайной» строки или идентификатора, если вы не дважды проверяете, что это не дубликат, тогда всегда есть такая возможность.;)
В то время как uniqid основан на текущем времени, вышеописанная предостерегающая нота - все зависит от того, где вы будете использовать эти «уникальные идентификаторы». Подсказка ко всему этому заключается в том, где говорится «более уникально». Уникальный уникальный. Как вы можете иметь что-то более или менее уникальное, немного запутывает меня!
Проверяя, как указано выше, и объединяя все это, вы в конечном итоге получите что-то, приближающееся к уникальности, но все это относительно где будут использоваться ключи и контекст. Надеюсь, что это поможет!
10^47
лет, чтобы иметь 50% вероятность столкновения ... Так что да, с высоким большим достаточно верхняя граница случайного числа И достаточно хороший RNG, вы можете имитировать уникальность только с случайностью ...
– ircmaxell
1 November 2010 в 16:35
rand()
, имели бы вероятность 90% столкновения на самой первой итерации i>. Кроме того, если вам нужна >> уникальность, даже 1001% вероятность столкновения слишком велика.
– cHao
22 August 2013 в 14:13
Из обсуждений о функции на сайте PHP:
Как и другие ниже, без префикса и без «добавленной энтропии» эта функция просто возвращает отметку времени UNIX с добавленным счетчиком микросекунд как шестнадцатеричное число; это более или менее просто microtime () в форме hexit.
[...]
Также стоит отметить, что поскольку microtime () работает только с системами, имеющими gettimeofday ( )> присутствует, что Windows изначально НЕ ДЕЛАЕТ, uniqid () может дать только временную метку UNIX с однократным разрешением в среде Windows.
blockquote>Другими словами, без «more_entropy» функция абсолютно ужасен и никогда не должен использоваться, период. Подписывая документацию, флаг будет использовать «объединенный линейный конгруэнтный генератор» для «добавления энтропии». Ну, это довольно слабый RNG. Поэтому я полностью пропустил эту функцию и использовал что-то, основанное на mt_rand , с хорошим семенем для вещей, не относящихся к безопасности, и SHA-256 для вещей, которые есть.
Без флага more_unique он возвращает временную метку unix с микросекундным счетчиком, поэтому, если два вызова выполняются в одну и ту же микросекунду, тогда они вернут один и тот же «уникальный» идентификатор.
Оттуда вопрос о том, насколько это возможно. Ответ не очень, но не со скидкой. Если вам нужен уникальный идентификатор, и вы часто его генерируете (или работаете с данными, созданными в другом месте), не считайте его абсолютно уникальным.
Соответствующим битом из исходного кода является
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 не является криптографически надежным генератором псевдослучайных чисел).
uniqid
(или его производные) для чего-либо, связанного с безопасностью. PHP предлагает целый ряд криптобезопасных случайных генераторов, таких как:openssl_random_pseudo_bytes
. Используйте подходящий инструмент для работы. – Halcyon 4 December 2013 в 18:01do{} while(collision)
. Я использую этот подход при создании путей для загруженных файлов, например. – afilina 12 August 2015 в 14:04