Стоит задача генерировать уникальный идентификатор, использовать базу исключительно для генерации уникального значения считаю не корректным решением. Нашёл решение через Semaphore + Shared Memory: PHP: <?php $semaphoreId = 100; $segId = 200; // get a handle to the semaphore $sem = sem_get($semId, 1, 0600); // ensure exclusive access... sem_acquire($sem) or die('Cannot acqire semaphore'); // get a handle to the shared memory sized 16k $shm = shm_attach($segId, 16386, 0600); // get a value from memory... $var = shm_get_var($shm, 'myVar'); // change the value however you like... $var++; // save it back to memory shm_put_var($shm, 'myVar', $var); // cleanup shm_detach($shm); sem_release($sem); ?> Но есть недостаток: Можно конечно использовать IP + time(), но тоже вариант не надежный. Как еще можно получить уникальный идентификатор?
мдя уникальности и рандомность разные понятия сообственно обычно делал так : для айди буквино цифринного ряда base_convert(md5({IP})+md5(time()*mt_rand()),16,36) для цифр base_convert(md5({IP})+md5(time()*mt_rand()),16,10)
А может кто-ниубдь знает, как сгенерировать уникальный короткий ID без проверки существования его в базе? Как, например, на ютуб "6FT7JEpkQf4".
Sergey89 -слабо себе представляю один и тотже АйПи + в одну и туже секунду да ещё ранд выдал одинаковые значения.... думаю вероятность стремится к нулю и столь малая что можно пренебречь кстати для твоей задачи может подойти подобное только на место айпи - айди записи я бы думал именно в этом направлении ;-) [sql] CONV(MD5(ID),16,36)[/sql]
uniqid в выдаче опирается на текущее время. поэтому первые несколько символов будут совпадать у большого числа объектов, добавляемых друг за другом.
А почему бы не.... PHP: $id = file_get_contents('sequence.txt'); file_put_contents('sequence.txt', ++$id); echo $id;
еще вариант ))) PHP: <?php /*9*/ $file=file_get_contents(__FILE__); $n = explode("\n", $file); preg_match('/\/\*(\d+)\*\//', $n[1], $m); $n[1] = str_replace($m[1], $m[1]+1, $n[1]); file_put_contents(__FILE__, implode("\n", $n)); echo $m[1]+1; ?>
Вльдемар Даже и не думай! При одновременном чтении, все потоки получат одинаковый id. А если в момент чтения одним потоком, будет происходить запись вторым потоком, то вообще пустой файл получишь. К тому же следует помнить, что очищения буфера и немедленная запись данных происходит только при вызове fflush(). Этот вариант неприемлем не с какой стороны. Всем спасибо. Вопрос был решен на 2-м посту. Тему можно закрывать
mclaud - неторопись .. тут уже и вторичные вопросы пошли http://php.ru/forum/viewtopic.php?p=104775#104775
PHP: $a=md5(uniqid().rand(0,2147483647)); for($i=0;$i<=11;$i++) { $str.=substr($a,rand(1,strlen($a)),1); } echo $str; Среди миллиона сгенерированых этим кодом строк совпадений небыло.
Не проще ли просто попытаться вставить с обычным md5(microtime(true)) а если такой есть попробовать ещё раз ? (шансов что они совпадут так мало что лишний запрос к базе погоды не сделает)
Вот написал такую штуку: PHP: <?php $ui_str=md5(uniqid().rand(0,2147483647)); for($i=0;$i<=11;$i++) { $ui.=substr($ui_str,rand(1,strlen($ui_str)),1); } echo $ui; Для теста прогнал в цикле миллион раз, добавляя результат в массив. Все результаты получились уникальными
Ну у меня кроме uniqid еще и один большой рендом, один хэш и 12 маленьких рендомов )) Значения цифро-буквенные, при чем буквы как строчные, так и прописные. Значит, может быть 12^62 степени вариантов!