За последние 24 часа нас посетили 71280 программистов и 10240 роботов. Сейчас ищут 2822 программиста ...

генерация 8-ми символьного уникального хэша

Тема в разделе "PHP для новичков", создана пользователем mk-ned, 27 май 2015.

  1. mk-ned

    mk-ned Новичок

    С нами с:
    19 фев 2014
    Сообщения:
    25
    Симпатии:
    0
    нужна помощь
    надо чтобы после регистрации пользователя генерировался случайные, уникальный буквенно-цифровая строка который будет записываться в БД, не обязательно чтоб он был супер зашифрованным но обязательно должен быть уникальным . нашёл два способа, они практически идентичны(по моему, я новичок, могу ошибаться), но какой создаёт более уникальный хэш?
    Код (Text):
    1.  
    2. 1 ---  substr(md5(microtime()),0,8);
    3. 2 ---  substr(md5(uniqid(rand(), true)),0,8);
    посоветуйте какой использовать или предложите другой.
    спасибо
     
  2. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    можно еще проще
    Код (Text):
    1. substr(uniqid(),0,8);
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    нет нельзя. этот код будет возвращать одинаковую строку в течении каждой секунды.

    сам то проверяй то что предлагаешь )
     
  4. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    просто генерировать случайную строку а потом сверять ее с базой не вариант?
    8 символов маловато как то.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    И ничего из вышеприведенного не гарантирует уникальность полученного "хэша". Теория вероятности сидит и смеется.

    Таким макаром даже из разных хэшей вы рискуете получить одинаковый идентификатор.

    Добавлено спустя 1 минуту 57 секунд:
    На деле достаточно, если именно генерировать строку. Более, чем достаточно.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Fell-x27, надо генерировать случайную строку и сверять ее с БД? если что генерировать новую?
     
  8. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    а зачем сверять? можно сделать уникальное поле в БД :)
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а при добавлении такого возвращается ответ типа "да, все ок" или "ошибка, уже задано"? если так, то конечно сверять ничего не надо, просто штампуешь строки и добавляешь.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    uniqid() зависит от таймера, а пхп-шный таймер на винде походу использует GetTickCount(), т.е. примерно раз в 1/100 секунды изменяется.
    это может быть важно для генерации серии уникальных значений!

    в любом случае, надо быть готовым к коллизиям. уникальный индекс MUST HAVE и, возможно, повторная попытка при неудаче, но только после usleep() чтобы дать таймеру измениться.
     
  11. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    даже если не задан - можно задать. В чем проблема? :)
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    алсо, если хочется емкость, т.е. энтропию случайности увеличить, то нет смысла ограничиваться 0-9a-f, надо использовать более широкий алфавит.

    еще один генератор случайной строки чтоли написать?
    http://stackoverflow.com/questions/4757392/php-fast-random-string-function
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    И тут пришел сурикат и нагадил в малину.
    Автор, а чем тебе, для твоих целей, не угодил обычный автоинкремент на унике?
     
    Maputo нравится это.
  14. mk-ned

    mk-ned Новичок

    С нами с:
    19 фев 2014
    Сообщения:
    25
    Симпатии:
    0
    я так понял самый лучший вариант в БД сделать хэш уникальным и во время регистрации проверять чтобы ошибок не было,
    если так то какой из выше приведённых примеров использовать? или может другой?
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. function getUniqId($in=false) {
    2.   if ($in===false) $in=microtime(1)*10000;
    3.   static $a = [0,1,2,3,4,5,6,7,8,9
    4.     ,'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'
    5.     ,'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'
    6.   ];
    7.   $base = sizeof($a);
    8.   $h = '';
    9.   while($in>=$base) {
    10.     $d1 = floor($in/$base);
    11.     $ost = $in-$d1*$base;
    12.     $in = $d1;
    13.     $h .= $a[$ost];
    14.   }//while
    15.   return strrev($h.$a[$in]);
    16. }
    17. echo getUniqId(); // 44eGtwLN   
    уникальность пропадает если вызывать чаще чем каждую микросекунду )
     
  16. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    как вариант, в БД сделать уникальное поле, и написать sql-запрос( я бы например написал триггер ) - проще и быстрей... Не нужно будет гонять между php и mySql...
     
    Maputo нравится это.
  17. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    чего не написано? )) ты же сам её обрезаешь потом до 8 символов. вот и теряется кусок который как раз меняться должен
     
  18. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    да, вырезать как раз который и меняется :)
     
  19. mk-ned

    mk-ned Новичок

    С нами с:
    19 фев 2014
    Сообщения:
    25
    Симпатии:
    0
    так вырежу середину или последние 8
     
  20. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    последние, правые 8 символов..
     
  21. mk-ned

    mk-ned Новичок

    С нами с:
    19 фев 2014
    Сообщения:
    25
    Симпатии:
    0
    какой из выше приведённых примеров использовать?
     
  22. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    рука лицо.....
    да нельзя правые тоже! они БУДУТ повторяться же, по сути каждый час(или даже чаще) одни и теже ключи будут правые.
    это же как счетчик.
     
  23. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    епааать... странная функция... ничего об этом нету в доке :)
    все так правильнее сразу на стороне mySQL-сервера делать :)
     
  24. mk-ned

    mk-ned Новичок

    С нами с:
    19 фев 2014
    Сообщения:
    25
    Симпатии:
    0
    а если создавать password_hash-ом и потом отрезать 8 последних символов, будет уникальным?
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    [​IMG]
    НЕТ, ты тупо закладываешь прям своими руками вероятность коллизии.
    Хочешь, чтобы был уникальным, создавай хэш и не обрезай его. Зачем это вот выпиливание в 8 символов вообще? Чем оно продиктовано? Почему нельзя просто хранить нормальный хэш пароля?