За последние 24 часа нас посетили 49674 программиста и 1728 роботов. Сейчас ищут 638 программистов ...

Генерация уникального идентификатора, без использования БД

Тема в разделе "Прочие вопросы по PHP", создана пользователем mclaud, 26 июн 2008.

Статус темы:
Закрыта.
  1. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Стоит задача генерировать уникальный идентификатор, использовать базу исключительно для генерации уникального значения считаю не корректным решением.
    Нашёл решение через Semaphore + Shared Memory:
    PHP:
    1. <?php
    2. $semaphoreId = 100;
    3. $segId = 200;
    4. // get a handle to the semaphore
    5. $sem = sem_get($semId, 1, 0600);
    6. // ensure exclusive access...
    7. sem_acquire($sem) or die('Cannot acqire semaphore');
    8. // get a handle to the shared memory sized 16k
    9. $shm = shm_attach($segId, 16386, 0600);
    10. // get a value from memory...
    11. $var = shm_get_var($shm, 'myVar');
    12. // change the value however you like...
    13. $var++;
    14. // save it back to memory
    15. shm_put_var($shm, 'myVar', $var);
    16. // cleanup
    17. shm_detach($shm);
    18. ?>
    Но есть недостаток:
    Можно конечно использовать IP + time(), но тоже вариант не надежный.

    Как еще можно получить уникальный идентификатор?
     
  2. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    mt_rand
    uniqid
     
  3. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Спасибо! Это имено то, что нужно!
     
  4. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    мдя
    уникальности и рандомность разные понятия

    сообственно обычно делал так :
    для айди буквино цифринного ряда base_convert(md5({IP})+md5(time()*mt_rand()),16,36)
    для цифр base_convert(md5({IP})+md5(time()*mt_rand()),16,10)
     
  5. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А может кто-ниубдь знает, как сгенерировать уникальный короткий ID без проверки существования его в базе? Как, например, на ютуб "6FT7JEpkQf4".
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Всё же существует вероятность совпадения. При определённых комбинациях.
     
  7. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Sergey89 -слабо себе представляю :) один и тотже АйПи + в одну и туже секунду да ещё ранд выдал одинаковые значения.... думаю вероятность стремится к нулю и столь малая что можно пренебречь

    кстати для твоей задачи может подойти подобное только на место айпи - айди записи :) я бы думал именно в этом направлении ;-)
    [sql]
    CONV(MD5(ID),16,36)[/sql]
     
  8. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Sergey89

    чем плох uniqid ?
     
  9. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Он некрасивый =)
     
  10. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    не пойму, чем "48635f5b3c3a6" хуже "6FT7JEpkQf4"
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    uniqid в выдаче опирается на текущее время. поэтому первые несколько символов будут совпадать у большого числа объектов, добавляемых друг за другом.
     
  12. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
  13. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Вльдемар
    +1, Гениально :)
     
  14. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
  15. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Вльдемар
    Даже и не думай!
    При одновременном чтении, все потоки получат одинаковый id. А если в момент чтения одним потоком, будет происходить запись вторым потоком, то вообще пустой файл получишь. К тому же следует помнить, что очищения буфера и немедленная запись данных происходит только при вызове fflush().
    Этот вариант неприемлем не с какой стороны.
    Всем спасибо. Вопрос был решен на 2-м посту.

    Тему можно закрывать
     
  16. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. $a=md5(uniqid().rand(0,2147483647));
    2. for($i=0;$i<=11;$i++)
    3. {
    4.     $str.=substr($a,rand(1,strlen($a)),1);
    5. }
    6. echo $str;
    Среди миллиона сгенерированых этим кодом строк совпадений небыло.
     
  18. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    У нас 3/4 Эстонии сидит на 5 IP адресах, так что шансов более чем достаточно
     
  19. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Эта строка уже сводит на нет всю идею.
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Не проще ли просто попытаться вставить с обычным md5(microtime(true)) а если такой есть попробовать ещё раз ?
    (шансов что они совпадут так мало что лишний запрос к базе погоды не сделает)
     
  21. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    туда же можно еще приплюсовать вывод уникид=)
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вот написал такую штуку:
    PHP:
    1. <?php
    2. $ui_str=md5(uniqid().rand(0,2147483647));
    3. for($i=0;$i<=11;$i++)
    4. {
    5.     $ui.=substr($ui_str,rand(1,strlen($ui_str)),1);
    6. }
    7. echo $ui;
    Для теста прогнал в цикле миллион раз, добавляя результат в массив. Все результаты получились уникальными :)
     
  23. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    А для теста миллион одновременных запросов сделать не хочешь?
    А потом окажется, что:
    :D
     
  24. BS

    BS Активный пользователь

    С нами с:
    10 апр 2008
    Сообщения:
    149
    Симпатии:
    0
    PHP:
    1.  
    2. for($i=1, $s=''; $i<mt_rand(2,5); $i++,$s.=uniqid());
    3. echo(md5($s));
    4.  
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ну у меня кроме uniqid еще и один большой рендом, один хэш и 12 маленьких рендомов )) Значения цифро-буквенные, при чем буквы как строчные, так и прописные. Значит, может быть 12^62 степени вариантов!
     
Статус темы:
Закрыта.