Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Стали замечать проблему, что часты коллизии. Написал функцию по подобию используемой в проекте (в частности диапазон тот же). Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. На локальном компьютере она не дает коллизий даже если использую для теста массивы длиной 10000. На боевом же сервере коллизии так и прут. В тестовой функции их множество, даже если брать длину массива 1000. В проекте же вообще берутся случайные числа примерно 1-10 раз в секунду. Причем коллизии как я понял чаще всего возникают в одно и то же время в параллельных скриптах. Раньше использовали функцию uniqueid но решили от нее отказаться ввиду того что было много коллизий. Функцию переписал так, но не на много лучше стало: Код: php 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 12:58 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Hett, mt_rand() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 13:04 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
На локальном компьютере mt_rand ведет себя значительно хуже. А на сервере я при подобном тесте не ощутил разницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 13:46 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Hett, опишите исходную задачу. зачем вам так часто вызывать рандом? чего хотите добиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 14:01 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Есть поток данных, которые записываются в БД (хранится примерно 2кк записей последних сейчас). Ну записи добавляются постоянно, старые удаляются. Нужен уникальный ключ для записей, да такой, чтобы пользователи не могли на основании его знать сколько данных было добавлено. Собстна использовался uniqueid, но он стал лажать когда поток данных немножко возрос. Переписал вот как выше, по началу вроде лучше стало (хотя может стечение обстоятельств), а потом опять та же картина. Вообще если так поглядеть на алгоритм, то шансов коллизий должно быть очень мало. Но за день проскакивает таких штук по 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 15:00 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Hett, Ну взять md5(microtime(true)) и отрезать сколько надо. Правда, может будет тормозить :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 15:30 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Hett Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. У вас несколько меньше миллиона возможных значений, и вы хотите отсутствия коллизий для десяти тысяч выбранных значений? http://ru.wikipedia.org/wiki/Парадокс_дней_рождения#.D0.9E.D0.B1.D0.BE.D0.B1.D1.89.D0.B5.D0.BD.D0.B8.D1.8F ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 15:45 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Если не осилите статью, можно примерно так прикинуть: чтобы вероятность коллизий N чисел не превышала p, надо выбирать числа из диапазона N^2/p. Например, хотите чтобы в выборке из 10000 чисел вероятность коллизии была не больше 1% - выбирайте из 10000*10000/0.01 - миллиарда возможных значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 16:05 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Hett, У меня была похожая ситуация на 2 разных серверах тогда я генерировал ключ длиной 32 символа от 0 до F. Ну думал ну как могут быть коллизии :) хотя проверку коллизии делал. Так вот на двух серверах с нагрузкой образно говоря с разницей в 100 раз (почти в одно и тоже время разница месяц). механизм перестал генерировать уникальные ключи, т.е. генерировал то что уже когда то было. Тогда я поступил так strtoupper(dechex(time())) и конкатенировал с оставшейся длинной ключа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 16:50 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
?Если не осилите статью, можно примерно так прикинуть: чтобы вероятность коллизий N чисел не превышала p, надо выбирать числа из диапазона N^2/p. Например, хотите чтобы в выборке из 10000 чисел вероятность коллизии была не больше 1% - выбирайте из 10000*10000/0.01 - миллиарда возможных значений. Дело в том, что это всего лишь тестовая функция и она не дает коллизий (по крайней мере мне не попались при многократном запуске) на моем локальном копьютере. А вот на сервере из 100 тестов по 1000 рандомных значений получается примерно 15 коллизий. В проекте же вообще они получаются из 10 записей и относительно очень часто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 17:51 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
phpzHett, Ну взять md5(microtime(true)) и отрезать сколько надо. Правда, может будет тормозить :-) ну да, можно взять еще микротайм+рандом. Просто думал может кто сталкивался с этим и знает еще какие-то решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 17:52 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
HettВ проекте же вообще они получаются из 10 записей и относительно очень часто. Хотя 10 это вообще максимум который бывает очень редко. В среднем там 2-5 записей в секунду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 17:53 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
автор Просто думал может кто сталкивался с этим и знает еще какие-то решения. GUID? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:07 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
HettНа боевом же сервере коллизии так и прут.Гипотеза с потолка - процессор, случаем, не AMD? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:16 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
miksoftHettНа боевом же сервере коллизии так и прут.Гипотеза с потолка - процессор, случаем, не AMD? Два процессора Intel(R) Xeon(R) CPU E3-1270 V2 @ 3.50GHz ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:23 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Корочи на линуксе (в частносте убунте) такое странное поведение. Я попробовал на домашнем компе, Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Показало 0. А на вритуалке на этом же железе ~50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 19:02 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Hett, Я бы этой строке кода сильно не доверял: Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 22:58 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
HettДело в том, что это всего лишь тестовая функция и она не дает коллизий (по крайней мере мне не попались при многократном запуске) на моем локальном копьютере. А вот на сервере из 100 тестов по 1000 рандомных значений получается примерно 15 коллизий. В проекте же вообще они получаются из 10 записей и относительно очень часто.На винде тестируете? Ну это как раз на винде random в php не рандомный - выдает фиксированную последовательность из 32768 разных значений, которая потом повторяется по циклу. А для случайных чисел коллизии должны быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 07:32 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
В статье на wiki обоснование. На пальцах - десять тысяч чисел - это сто миллионов пар. Сто миллионов раз берете пару случайных значений из одного миллиона возможных и проверяете что они не совпали. Да, и числа выдаваемые функциями rand, mt_rand и т.п. - в любом случае не случайные :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 07:46 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
phpzHett, Ну взять md5(microtime(true)) и отрезать сколько надо. Правда, может будет тормозить :-)Если отрезать 5 символов, то на 10000 значений коллизии будут - я вам гарантирую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 08:32 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
HettНужен уникальный ключ для записей, да такой, чтобы пользователи не могли на основании его знать сколько данных было добавлено. ну и зачем тогда так заморачиваться? имеем в таблице PK id автоинкремент на его основе делаем суррогатный ключ равный md5( $id.$SALT ) и непаримся коллизии почти исключены, юзеры ничего угадать несмогут. длинноват - но думаю это непроблема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 08:34 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
HettphpzHett, Ну взять md5(microtime(true)) и отрезать сколько надо. Правда, может будет тормозить :-) ну да, можно взять еще микротайм+рандом. Просто думал может кто сталкивался с этим и знает еще какие-то решения.Вообще-то для гарантированного отсутствия коллизий только одно решение - брать автоинкрементный счетчик. Шифровать его значение. В результатах шифрования ни в коем случае ничего не обрезать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 08:36 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
Я хотел посвятить топик скорее вопросу рандома, придумать другой вариант без коллизий в общем-то не проблема) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 09:43 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
?phpzHett, Ну взять md5(microtime(true)) и отрезать сколько надо. Правда, может будет тормозить :-)Если отрезать 5 символов, то на 10000 значений коллизии будут - я вам гарантирую. Монстр: Код: php 1. А вообще-то может стОит /dev/urandom заюзать Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 09:44 |
|
||
|
Какой-от не очень рандомный рандом
|
|||
|---|---|---|---|
|
#18+
HettЯ хотел посвятить топик скорее вопросу рандома, придумать другой вариант без коллизий в общем-то не проблема) Ну тогда еще раз читайте http://ru.wikipedia.org/wiki/Парадокс_дней_рождения и http://ru.wikipedia.org/wiki/Атака_«дней_рождения» до просветления. С выбранными вами диапазонами коллизии обязательно будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 10:38 |
|
||
|
|

start [/forum/topic.php?fid=23&fpage=109&tid=1463690]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 354ms |

| 0 / 0 |
