нужна помощь надо чтобы после регистрации пользователя генерировался случайные, уникальный буквенно-цифровая строка который будет записываться в БД, не обязательно чтоб он был супер зашифрованным но обязательно должен быть уникальным . нашёл два способа, они практически идентичны(по моему, я новичок, могу ошибаться), но какой создаёт более уникальный хэш? Код (Text): 1 --- substr(md5(microtime()),0,8); 2 --- substr(md5(uniqid(rand(), true)),0,8); посоветуйте какой использовать или предложите другой. спасибо
нет нельзя. этот код будет возвращать одинаковую строку в течении каждой секунды. сам то проверяй то что предлагаешь )
просто генерировать случайную строку а потом сверять ее с базой не вариант? 8 символов маловато как то.
И ничего из вышеприведенного не гарантирует уникальность полученного "хэша". Теория вероятности сидит и смеется. Таким макаром даже из разных хэшей вы рискуете получить одинаковый идентификатор. Добавлено спустя 1 минуту 57 секунд: На деле достаточно, если именно генерировать строку. Более, чем достаточно.
а при добавлении такого возвращается ответ типа "да, все ок" или "ошибка, уже задано"? если так, то конечно сверять ничего не надо, просто штампуешь строки и добавляешь.
uniqid() зависит от таймера, а пхп-шный таймер на винде походу использует GetTickCount(), т.е. примерно раз в 1/100 секунды изменяется. это может быть важно для генерации серии уникальных значений! в любом случае, надо быть готовым к коллизиям. уникальный индекс MUST HAVE и, возможно, повторная попытка при неудаче, но только после usleep() чтобы дать таймеру измениться.
алсо, если хочется емкость, т.е. энтропию случайности увеличить, то нет смысла ограничиваться 0-9a-f, надо использовать более широкий алфавит. еще один генератор случайной строки чтоли написать? http://stackoverflow.com/questions/4757392/php-fast-random-string-function
И тут пришел сурикат и нагадил в малину. Автор, а чем тебе, для твоих целей, не угодил обычный автоинкремент на унике?
я так понял самый лучший вариант в БД сделать хэш уникальным и во время регистрации проверять чтобы ошибок не было, если так то какой из выше приведённых примеров использовать? или может другой?
Код (PHP): function getUniqId($in=false) { if ($in===false) $in=microtime(1)*10000; static $a = [0,1,2,3,4,5,6,7,8,9 ,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' ,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' ]; $base = sizeof($a); $h = ''; while($in>=$base) { $d1 = floor($in/$base); $ost = $in-$d1*$base; $in = $d1; $h .= $a[$ost]; }//while return strrev($h.$a[$in]); } echo getUniqId(); // 44eGtwLN уникальность пропадает если вызывать чаще чем каждую микросекунду )
как вариант, в БД сделать уникальное поле, и написать sql-запрос( я бы например написал триггер ) - проще и быстрей... Не нужно будет гонять между php и mySql...
чего не написано? )) ты же сам её обрезаешь потом до 8 символов. вот и теряется кусок который как раз меняться должен
рука лицо..... да нельзя правые тоже! они БУДУТ повторяться же, по сути каждый час(или даже чаще) одни и теже ключи будут правые. это же как счетчик.
епааать... странная функция... ничего об этом нету в доке все так правильнее сразу на стороне mySQL-сервера делать
НЕТ, ты тупо закладываешь прям своими руками вероятность коллизии. Хочешь, чтобы был уникальным, создавай хэш и не обрезай его. Зачем это вот выпиливание в 8 символов вообще? Чем оно продиктовано? Почему нельзя просто хранить нормальный хэш пароля?