ФорумПрограммированиеPHP для идиотов → Умная генерация пин-кодов.

Умная генерация пин-кодов.

  • disc

    Сообщения: 843 Репутация: N Группа: Джедаи

    Spritz 29 января 2009 г. 5:56

    Вопрос больше теоретический чем практический, но. Итак, имею задачу создать систему генерации пин-кодов, решил не идти простым путем, т.к. один раз уже им пошел, система на данный момент работает, но мне не нравится такое решение.
    Чтобы генерировать пин сейчас, я делаю следующее:

    • Генерирую rand() цифровой код

    • Сравниваю его SELECT'ом в базе и если такой есть генерирую заново (пункт 1)


    Все это сдельно в php-коде, были мысли сделать это хранимой процедурой в мускле, но решение ничем отличаться не будет, крмое небольшого выигрыша в скорости т.к. все будет варится в самой базе.

    Че я от вас всех хочу то, спросите вы. А хочу совета, как лучше построить такую систему чтоб она работала и генерировала пин-код максимально быстро без лишних действий. На данный момент я использовал код, из 8 цифр, база наполняется со средней скоростью, т.е. пинов хватит на долго, но меня все равно смущает лишние действии при постоянном рэндоме и поиске.
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 29 января 2009 г. 6:12, спустя 15 минут 52 секунды

    Сгенерировать мульйон кодов, записать их в файл, и оттудава постепенно выбирать по одному :) Вообще rand() выполняется практически не заметно, а запрос в базу - тоже не столь затратное дело. Так что выиграша вряд ли получишь.
  • disc

    Сообщения: 843 Репутация: N Группа: Джедаи

    Spritz 29 января 2009 г. 6:16, спустя 4 минуты 11 секунд


    Сгенерировать мульйон кодов, записать их в файл, и оттудава постепенно выбирать по одному :) Вообще rand() выполняется практически не заметно, а запрос в базу - тоже не столь затратное дело. Так что выиграша вряд ли получишь.

    Не хочу генерить сразу все коды, т.к. возможны учетки и кто-то сольет формулу либо коды, в случае простых 7 цифр формула не такая уж и сложная. Понятно что есть защиты от перебора и прочее, но на данный момент важен вопрос, указанный выше.
    —-
    UPD: Понятно что rand() и запрос в БД в единичном экземпляре атомарные операции жрущие очень мало всего, но когда табличка на половину забита пинами, то точное срабатывание RAND() теоретически равно 1/2, это теоретически а как на самом деле уже не известно. Не хочется генерить пины по порядку, т.к. это тоже я считаюы дырой вычислить и пробить его по базе.
    UPD2:
    В общем я вроде как понял что мне надо :) Нужно придумать такой пин-код который будет уникальный в своем роде, и который не будет подвержен колизиям. Что-то вроде XXXXX-YYYYYYZZZ
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 29 января 2009 г. 6:34, спустя 17 минут 29 секунд


    UPD2:
    В общем я вроде как понял что мне надо :) Нужно придумать такой пин-код который будет уникальный в своем роде, и который не будет подвержен колизиям. Что-то вроде XXXXX-YYYYYYZZZ

    В таком случае достаточно просто увеличить кол-во цифер в уже формирующихся пинах с 7 до 9-11, и будет на парочку мульйонов комбинаций больше :)
  • disc

    Сообщения: 843 Репутация: N Группа: Джедаи

    Spritz 29 января 2009 г. 6:36, спустя 2 минуты 24 секунды



    UPD2:
    В общем я вроде как понял что мне надо :) Нужно придумать такой пин-код который будет уникальный в своем роде, и который не будет подвержен колизиям. Что-то вроде XXXXX-YYYYYYZZZ

    В таком случае достаточно просто увеличить кол-во цифер в уже формирующихся пинах с 7 до 9-11, и будет на парочку мульйонов комбинаций больше :)

    Это не решит задачу рэндома и запроса в цикле. Теперь надо создать формулу генерации уникального пина. Ищу к чему можно было бы привязать 3 группы символов.
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо
  • disc

    Сообщения: 843 Репутация: N Группа: Джедаи

    Spritz 29 января 2009 г. 7:12, спустя 33 минуты 40 секунд

    CTAPbIu_MABP, ну это в большей части безопастность для виндузятников и их серверов. Помнится нас в технаре по этому поводу учили в паскале юзать randomize() функция чтобы rand() с самого старта программы отличался от предыдущего запуска, не по теме конечно но все равно спасибо.
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 29 января 2009 г. 7:53, спустя 40 минут 44 секунды

    а при чем там винда?
  • disc

    Сообщения: 843 Репутация: N Группа: Джедаи

    Spritz 29 января 2009 г. 8:01, спустя 7 минут 53 секунды


    а при чем там винда?

    P.S. Как выяснилось позже особенности rand(), о которых я писал выше, возможны только на win32! В UNIX числа получаются достаточно длинными и не связанными между собой - видимо PHP получает случайные числа из устройства /dev/(u)random
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 29 января 2009 г. 8:04, спустя 2 минуты 48 секунд

    а вот как… незаметил…

    еще один пункт в список за что я не люблю винду

Пожалуйста, авторизуйтесь, чтобы написать комментарий!