Для удобства написал такую функцию
#Генерирование случайной строки заданной длинны. Макс. 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) |
Кто сечет в ТВ подскажите. |
Тервер.. ну ты загнул Грубо: если у тебя на кубике 6 сторон, какова вероятность выпадения одной из сторон? 1:6, верно? Если 16 шестнадцатиричных символов, то следовательно вероятность будет 1:16^16 как минимум, а так как ты используешь чистый рандом, то вероятность коллизии хэшей может быть больше.
Но переживать по этому случаю не стоит. Наврядли у тебя будет столько id-шников чтобы случился дубликат.
А вообще какбэ принято использовать числовые значения для id..
Спустя 9 минут, 4 секунды (26.01.2011 - 09:39) Michael написал(а):
Если у тебя в строке может встречаться n - количество различных символов, то в строке длиной m может встретиться уникальных комбинаций:
md5 генерирует - встречаются строчная латиница и цифры - n = 33 + 10 = 43
p.s. ! - факториал
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 знаков достаточно?
Числовые это понятно, но я мне надо для адресации памяти - пишу собственную встраиваемаю СУБД, для таких целей хеш-ключи удобнее.
Michael
Т.е. вы считаете что 16 знаков достаточно?
Спустя 6 минут, 38 секунд (26.01.2011 - 09:53) Michael написал(а):
не, формулу неправильную дал. Правильная:
n = 16, как kirik уточнил
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();минигенератор уникальных ключей в массиве. :rolleyes:
$array[] = 'value';
Спустя 1 час, 12 минут, 21 секунда (26.01.2011 - 12:32) LRCenter написал(а):
linker
Это как работает?
Это как работает?
Спустя 1 час, 19 секунд (26.01.2011 - 13:33) linker написал(а):
Ключи в массиве автоматически инкрементятся, а значит получается их уникальность
Спустя 45 минут, 23 секунды (26.01.2011 - 14:18) LRCenter написал(а):
linker
Теперь понял. Но все же выберу хеш.
Теперь понял. Но все же выберу хеш.
Спустя 16 часов, 45 минут, 26 секунд (27.01.2011 - 07:03) LRCenter написал(а):
А вот еще хотел спросить.
На скорость работы функции md5 сильно влияет объем вводимых в нее данных?
Скажем я хеширую 1кб и 1Мб данных, скорость работы будет отличаться близко к пропорции размера данных?
На скорость работы функции 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 для создания отпечатка т.е. контрольной суммы файла на файловом хостинге, это наверное вообще уйму ресурсов жрет. Хорошо что только один раз делать надо
Понятно. Иногда используют md5 для создания отпечатка т.е. контрольной суммы файла на файловом хостинге, это наверное вообще уйму ресурсов жрет. Хорошо что только один раз делать надо
Спустя 2 часа, 50 минут, 40 секунд (27.01.2011 - 10:45) kirik написал(а):
Цитата (LRCenter @ 26.01.2011 - 23:54) |
Иногда используют md5 для создания отпечатка т.е. контрольной суммы файла на файловом хостинге, это наверное вообще уйму ресурсов жрет. |
Ага. можешь попробовать у себя посчитать хэш какого-нибудь фильма
Спустя 5 минут, 11 секунд (27.01.2011 - 10:50) LRCenter написал(а):
Попробовал на локалке. 1,5 гига.
Сервер умер через минуту
Сервер умер через минуту
Спустя 3 дня, 23 часа, 51 минута, 57 секунд (31.01.2011 - 10:42) LRCenter написал(а):
Можно понизить число разрядов в ключе, при сохранении вероятности совпадений, за счет использования всех символов латинского алфавита, а не только шести как в md5.
Только как вот написать функцию генерирования? Я имею ввиду по какому принципу чтобы это было близко к истинно случайности? Запустить rand() по циклу нужное число раз?
Подскажите как указать в rand() диапазон 0-9 вместе с a-Z, эта функция же вроде только с числами работает?
Только как вот написать функцию генерирования? Я имею ввиду по какому принципу чтобы это было близко к истинно случайности? Запустить rand() по циклу нужное число раз?
Подскажите как указать в rand() диапазон 0-9 вместе с a-Z, эта функция же вроде только с числами работает?
Спустя 20 минут, 56 секунд (31.01.2011 - 11:03) linker написал(а):
Бери время с долями секунд, плюс рандомное число.
Спустя 31 минута, 41 секунда (31.01.2011 - 11:34) LRCenter написал(а):
linker
Хорошая идея! Это сколько знаков в сумме получится? А как получить милисекунды? time() возвращает только целые секунды.
Хорошая идея! Это сколько знаков в сумме получится? А как получить милисекунды? 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 знаков возвращенных функцией приведенной в начале темы это будет достаточно надежно в смысле уникальности?
если ключ будет состоять из 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!
Но все же подстрахуюсь
microtime() возвращает время в микросекундах? Если да, то не тысячных а миллионных, микро - это 1/миллионная.
Спасибо, linker!
Но все же подстрахуюсь
microtime() возвращает время в микросекундах? Если да, то не тысячных а миллионных, микро - это 1/миллионная.
Спустя 2 минуты, 52 секунды (31.01.2011 - 15:40) linker написал(а):
LRCenter
time() + microtime() - я об этом.
time() + microtime() - я об этом.
_____________
Меньше кода - меньше багов ©