Какое максимальное целое беззнаковое число может принять переменная в РНР?

locust

Новичок
Какое максимальное целое беззнаковое число может принять переменная в РНР?

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

Пишу скрипт некой лотереи, суть которой заключается в том, что победителем оказывается тот человек, который назовет наименьшее уникальное число. Принимаемые от юзеров числа обрабатываются скриптом автоматически раз в сутки и оглашается победитель.
Я незнаю какое максимальное целое беззнаковое число может принять переменная в РНР (вроде как немногим больше 4 млрд. для 32-разрядной системы, но не уверен в том, что это максимум), поэтому возникают некоторые опасения по поводу безопасности работы скрипта. Прошу выслушать мои предположения:

1. если предположить, что найдутся юзеры, которые смогут сделать перебор по большому диапазону чисел программным методом (за участие в лотерее платить не надо - это раз, и угадывать число можно сколько угодно раз - это два), то это в итоге может привести к самым неожиданным последствиям. Например, максимальное число, которое может принять переменная в РНР - 1000. Злоюзер передаёт скрипту все 999 чисел по несколько раз, а число 1000 - один раз. В итоге получается, что минимальное уникальное число - 1000 и злоюзер становится победителем.
2. второе опасение - выход за диапазон максимально допустимого значения. Вернемся к примеру с одной тысячей: если передать скрипту число больше 1000, оно автоматически становится числом начала диапазона (например, если передать 1005 - скрипт превратит это число в 4).

В качестве защиты конечно можно использовать ограничения по "угадыванию" в определенный промежуток времени ( что уже не вяжется с предполагаемой политикой лотереи) и другие уловки, но всё это рано или поздно кто-то обойдет и лотерея окажется уязвимой.
Еще я думал над тем, чтобы принимать в переменную не число, а строку длиной в 255 символов, что уже фактически нереально подобрать за сутки. Всю работу по выборе минимального уникального значения хочу возложить на MySQL и работа эта будет проводиться раз в сутки - в период, когда по статистике меньше всего посетителей, поэтому возможная нагрузка на сервер и длительное выполнение не имеют значения, в принципе.

За чем я обращаюсь к конференции? За подсказкой на эти три вопроса:
1. Какое всё-таки максимальное целое беззнаковое значение может принимать переменная в РНР?
2. Какие еще потенциальные опасности ждут мой скрипт?
3. Есть ли на Ваш взгляд более разумные способы реализации данной идеи?
 

A1x

Новичок
пхп не поддерживае беззнаковых целых
наибольшее положительное - см. константу PHP_INT_MAX

-~{}~ 21.02.08 22:46:

почитайте в мануале раздел про Integers
 

locust

Новичок
Извиняюсь - сам себя ввёл в заблуждение в определинии названий.
Максимальное положительное целое - вот.
 

Gas

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

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

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

A1x

Новичок
победителем оказывается тот человек, который назовет наименьшее уникальное число.
чето смысл ускользает если честно :)

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

locust

Новичок
Автор оригинала: Gas
locust
посмотри типы данных php, mysql и определись достаточно ли большие числа для твоего случая они могут хранить. В строках без крайней необходимости не хранил бы и из описания не вижу такой необходимости.
для рнр (mysql это число поддерживает тоже): 2,147,483,647 - чего мне мало если взломают капчу и я некоторое время об этом не буду знать.

нужно постараться чтоб была большая нагрузка на этой операции, хотя...:)
разве? что ж, это только хорошо.
 

Gas

может по одной?
чего мне мало если взломают капчу и я некоторое время об этом не буду знать
и что, это сильно критично для бесплатной лотереи где можно голосовать сколько хочешь?

2,147,483,647 - мало? странно, похоже на sms-разводы, типа пришли свою максимальную стоимость товара в копейках и если она будет уникальной - ты выиграл. Для таких вещей вполне нормальный диапазон. Ну если мало - для mysql тип float: 1.175494351E-38, double: 2.2250738585072014E-308 (правда это теоритически). А какое максимальное число может хранить php, вообще волновать не должно, в php пусть это будет строка, всё равно все операции будут в базе.
 

Sluggard

Новичок
1. Какое всё-таки максимальное целое беззнаковое значение может принимать переменная в РНР?
В PHP - float (точность - 14 знаков).
В MySQL - BIGINT'а хватит.
Только не ясно, зачем тебе в PHP работать с числами, если ты, что из формы, что из базы будешь получать строки?
 

TutanXamoN

Новичок
2,147,483,647 - чего мне мало
locust
Ну если тебе мало то храни числа как строки и вспомни старые извращения насчёт массивов с числами:)
В таком случае ограничением будет лишь склонность к извращениям.
 

Gas

может по одной?
TutanXamoN
хранение и поиск будет в базе, там можно держать числа и значительно больше.
 

locust

Новичок
Автор оригинала: Sluggard
В PHP - float (точность - 14 знаков).
В MySQL - BIGINT'а хватит.
Только не ясно, зачем тебе в PHP работать с числами, если ты, что из формы, что из базы будешь получать строки?
были предположения на счет определения на минимальное уникальное "на лету" без БД с записью в файл...

2,147,483,647 - мало? странно, похоже на sms-разводы, типа пришли свою максимальную стоимость товара в копейках и если она будет уникальной - ты выиграл. Для таких вещей вполне нормальный диапазон
как я говорил - это всего лишь меры предосторожности. само собой, что 2,147,483,647 хватает для добропорядочных юзеров.

Спасибо всем, кто ответил - всё-таки я услишал то, что хотел.
:)
 

Gas

может по одной?
имхо, на лету могут быть проблемы с конкурентностью, источник который будет хранить это число нужно лочить на момент "взять максимальное из источника, сравнить c новым, если новое больше - поместить его в источник".
 

Ruzzz

Новичок
как я понимаю здесь можно не только sms но и для показа рекламы? )

вообще можно использовать mysql-кий тип bigint, но не все числа которые помещаются в диапазон этого типа, а выбрать диапазон который обеспечит "приемлемый уровень безопасности" и при этом будет легко проверятся как строка в php - например задать диапазон от 0 до 99 999 999 999 а проверку делать по is_numeric и strlen

насчет идеи "на лету": так или иначе, а работа быдет сделана (приблизительно) одна и таже, просто на лету она будет распределятся по времени всех запросов.

на счет того что писал выше Gas, MySQL ведь делает что-то подобное :), но лучше канешно использовать не "на лету" и БД
 

Gas

может по одной?
MySQL ведь делает что-то подобное
смотря что под "подобным" понимать, если рассмотреть самый простой вариант - в mysql просто заносить все числа, а потом по мере необходимости получать максимальное-уникальное. То для вставки в myisam"без дыр" или innodb без автоинкремента - локов быть не должно.

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

Ярослав

Новичок
Пример из Zend Framework

// this should be reduced to the max integer PHP can support
$count = intval(9223372036854775807);
 

Ярослав

Новичок
Автор оригинала: itprog
Ярослав
=== 0
Странно, проверил точно ===0
а вот intval('9223372036854775807') выводит
PHP:
int 2147483647
Но тогда я не понимаю этот кусок в зенде

PHP:
// determine offset
        $count = 0;
        $offset = 0;
        if (!empty($this->_parts[self::LIMIT_OFFSET])) {
            $offset = (int) $this->_parts[self::LIMIT_OFFSET];
            // this should be reduced to the max integer PHP can support
            $count = intval(9223372036854775807);
        }
P.S. Глючит вставка php кода
Вставляет только первую часть. Желательно поправить бы.

-~{}~ 23.02.08 22:40:

Фига се
echo intval(4200000000) === -94967296
Это почему так?? Просветите пожалуйста o-O
 

itprog

Cruftsman
Ярослав
не знаю :) все, что угодно
но не стоит относится к каждому куску кода из зенда как к святому. Его пишет не один и не десять человек
 
Сверху