[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: О вероятностях.
LRCenter
Генерирую id, с помощью md5 от времени в микросекундах + рэндомное число.
Для удобства написал такую функцию

#Генерирование случайной строки заданной длинны. Макс. 32 символа.
function genRandStr($numc){
$namex=md5(uniqid(rand(),1));
$namex=substr($namex, 0, $numc);
return $namex;}


Выдает максимально 256-битный ключ (32 знака).


А какая длинна ключа оптимальна? Нафиг хранить лишние данные? Скажем если использовать 16 знаков, какова вероятность совпадения 2-х id среди 1000? А 10000?

Кто сечет в ТВ подскажите.



Спустя 19 минут, 6 секунд (26.01.2011 - 09:30) kirik написал(а):
Цитата (LRCenter @ 26.01.2011 - 01:11)
Кто сечет в ТВ подскажите.

Тервер.. ну ты загнул smile.gif Грубо: если у тебя на кубике 6 сторон, какова вероятность выпадения одной из сторон? 1:6, верно? Если 16 шестнадцатиричных символов, то следовательно вероятность будет 1:16^16 как минимум, а так как ты используешь чистый рандом, то вероятность коллизии хэшей может быть больше.
Но переживать по этому случаю не стоит. Наврядли у тебя будет столько id-шников чтобы случился дубликат.
А вообще какбэ принято использовать числовые значения для id..

Спустя 9 минут, 4 секунды (26.01.2011 - 09:39) Michael написал(а):
Если у тебя в строке может встречаться n - количество различных символов, то в строке длиной m может встретиться уникальных комбинаций:
C = n!/(n - m)!



md5 генерирует - встречаются строчная латиница и цифры - n = 33 + 10 = 43

p.s. ! - факториал


Спустя 2 минуты (26.01.2011 - 09:41) kirik написал(а):
Цитата (Michael @ 26.01.2011 - 01:39)
md5 генерирует - встречаются строчная латиница и цифры - n = 33 + 10 = 43

не.. md5 отдает 0-9,a,b,c,d,e,f.

Спустя 4 минуты, 52 секунды (26.01.2011 - 09:46) LRCenter написал(а):
kirik
Числовые это понятно, но я мне надо для адресации памяти - пишу собственную встраиваемаю СУБД, для таких целей хеш-ключи удобнее.

Michael
Т.е. вы считаете что 16 знаков достаточно?

Спустя 6 минут, 38 секунд (26.01.2011 - 09:53) Michael написал(а):
не, формулу неправильную дал. Правильная:

n^m


n = 16, как kirik уточнил

Цитата
Т.е. вы считаете что 16 знаков достаточно?

не знаю ...., считай сам, думай, для чего оно там.

Спустя 7 минут, 15 секунд (26.01.2011 - 10:00) kirik написал(а):
Цитата (LRCenter @ 26.01.2011 - 01:46)
мне надо для адресации памяти - пишу собственную встраиваемаю СУБД, для таких целей хеш-ключи удобнее

Не могу представить чем удобнее.. но если хочется "ака-хэш" и при этом стопроцентно уникальный, просто сделай генератор айдишников типа:
Цитата
000..00, 000..01, 000..02 ... 000..0a, 000..0b ... 000...0z, 000...10 ...

Спустя 1 час, 19 минут, 51 секунда (26.01.2011 - 11:20) linker написал(а):
$array = array();
$array[] = 'value';
минигенератор уникальных ключей в массиве. :rolleyes:

Спустя 1 час, 12 минут, 21 секунда (26.01.2011 - 12:32) LRCenter написал(а):
linker
Это как работает? ohmy.gif

Спустя 1 час, 19 секунд (26.01.2011 - 13:33) linker написал(а):
Ключи в массиве автоматически инкрементятся, а значит получается их уникальность smile.gif

Спустя 45 минут, 23 секунды (26.01.2011 - 14:18) LRCenter написал(а):
linker
Теперь понял. Но все же выберу хеш.

Спустя 16 часов, 45 минут, 26 секунд (27.01.2011 - 07:03) LRCenter написал(а):
А вот еще хотел спросить.
На скорость работы функции md5 сильно влияет объем вводимых в нее данных?
Скажем я хеширую 1кб и 1Мб данных, скорость работы будет отличаться близко к пропорции размера данных?

Спустя 33 минуты, 15 секунд (27.01.2011 - 07:37) kirik написал(а):
Цитата (LRCenter @ 26.01.2011 - 23:03)
На скорость работы функции md5 сильно влияет объем вводимых в нее данных?

Конечно влияет. Насколько пропорционально сказать не могу, но мне кажется что зависимость вполне себе линейная.

Спустя 17 минут, 18 секунд (27.01.2011 - 07:54) LRCenter написал(а):
kirik
Понятно. Иногда используют md5 для создания отпечатка т.е. контрольной суммы файла на файловом хостинге, это наверное вообще уйму ресурсов жрет. Хорошо что только один раз делать надо smile.gif

Спустя 2 часа, 50 минут, 40 секунд (27.01.2011 - 10:45) kirik написал(а):
Цитата (LRCenter @ 26.01.2011 - 23:54)
Иногда используют md5 для создания отпечатка т.е. контрольной суммы файла на файловом хостинге, это наверное вообще уйму ресурсов жрет.

Ага. можешь попробовать у себя посчитать хэш какого-нибудь фильма smile.gif

Спустя 5 минут, 11 секунд (27.01.2011 - 10:50) LRCenter написал(а):
Попробовал на локалке. 1,5 гига.
Сервер умер через минуту sad.gif

Спустя 3 дня, 23 часа, 51 минута, 57 секунд (31.01.2011 - 10:42) LRCenter написал(а):
Можно понизить число разрядов в ключе, при сохранении вероятности совпадений, за счет использования всех символов латинского алфавита, а не только шести как в md5.

Только как вот написать функцию генерирования? Я имею ввиду по какому принципу чтобы это было близко к истинно случайности? Запустить rand() по циклу нужное число раз?

Подскажите как указать в rand() диапазон 0-9 вместе с a-Z, эта функция же вроде только с числами работает?

Спустя 20 минут, 56 секунд (31.01.2011 - 11:03) linker написал(а):
Бери время с долями секунд, плюс рандомное число.

Спустя 31 минута, 41 секунда (31.01.2011 - 11:34) LRCenter написал(а):
linker
Хорошая идея! Это сколько знаков в сумме получится? А как получить милисекунды? time() возвращает только целые секунды.

Спустя 1 минута, 18 секунд (31.01.2011 - 11:36) linker написал(а):
time() + microtime(1) + rand(1, 1000);

Спустя 36 минут, 33 секунды (31.01.2011 - 12:12) LRCenter написал(а):
linker
если ключ будет состоять из 10 цифр возвращенных time(), разделяющий символ, и 6 знаков возвращенных функцией приведенной в начале темы это будет достаточно надежно в смысле уникальности?

Спустя 1 час, 51 минута, 19 секунд (31.01.2011 - 14:04) linker написал(а):
Даже time() + microtime(1) дает гарантированную уникальность. Вряд ли твой скрипт будет работать настолько быстро - с точностью до тысячных долей секунды.

Спустя 1 час, 33 минуты, 44 секунды (31.01.2011 - 15:37) LRCenter написал(а):
linker
Спасибо, linker!
Но все же подстрахуюсь smile.gif


microtime() возвращает время в микросекундах? Если да, то не тысячных а миллионных, микро - это 1/миллионная.

Спустя 2 минуты, 52 секунды (31.01.2011 - 15:40) linker написал(а):
LRCenter
time() + microtime() - я об этом.


_____________
Меньше кода - меньше багов ©
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.