некорректная работа crc32() почему?

.scu

Новичок
некорректная работа crc32() почему?

Из-за чего может некорректно работать ф-ция crc32()?
При нормальной работе, например,
PHP:
crc32(8)
выдает -100641005
но на некоторых хостингах выдает: 4194326291

PHP на нерабочем варианте - 5.2.6, но и на некоторых рабочих хостингах стоит такая же версия php.

Какие у кого мысли есть по этому поводу?
 

.scu

Новичок
Единственное, что удалось найти, это то, что php неверно отрабатывает на 64-х битных системах (http://bugs.php.net/bug.php?id=39062).

вариант борьбы:

$crc = abs(crc32($string));
if( $crc & 0x80000000){
$crc ^= 0xffffffff;
$crc += 1;
}

Не подходит, т.к. неизвестно какой в реальности должен быть знак отрицательный или положительный.

Если какие-то пути решения этой проблемы?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: .scu
Если какие-то пути решения этой проблемы?
Работающий путь, для всех crc значений делать:
PHP:
$crc = $crc & 0xffffffff;
и после этого их начинать сравнивать.

Хотя, конечно, это одна из тех проблем, за которые похапэ заслуженно считают недоязыком, а его аффтаров --- идиотами.
 

tony2001

TeaM PHPClub
Sad Spirit
>Хотя, конечно, это одна из тех проблем, за которые похапэ заслуженно считают недоязыком, а его аффтаров --- идиотами.

не авторов, а пользователей, которые, в частности, неспособны понять разницу между 64bit и 32bit.
я уж не говорю о прочтении мануала - это абсолютно непосильная для пользователей задача.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: tony2001
не авторов, а пользователей, которые, в частности, неспособны понять разницу между 64bit и 32bit.
Ну да, ну да. Тот факт, что функция crc32() на 32-битной платформе отдаёт 32-битное число, а на 64-битной --- 64-битное, которое может не влезть в 32 бита, он кагбэ очевиден из самого названия функции.

я уж не говорю о прочтении мануала - это абсолютно непосильная для пользователей задача.
А в мануале написано следующее:
Because PHP's integer type is signed, and many crc32 checksums will result in negative integers
А про разницу между 32-битными и 64-битными платформами (на последних negative integers не возвращаются!) там ни слова, ага.

Просто кагбэ сделать одинаковое возвращаемое значение на любой платформе (или хотя бы нормально задокументировать разницу!) --- разработчикам как два пальца обоссать, но веселее ругаться в баг-репортах и форумах на "тупых пользователей".

Или есть ещё вариант сделать tr00 php-way:
  • добавить функцию crc3264() (а впоследствии crc32128())
  • добавить в crc32() вторым параметром константы CRC32_PLEASE_RETURN_SIGNED и CRC32_I_CRAVE_ASSWARDS_COMPATIBILITY

Думаю в конце концов придём к одному из этих гени[т]альных решений, бгыгыгы.

Да, tony2001, когда я делал HTTP_Request2, я нашёл одну проблемку в curl'е и парочку --- в похапэ. Баг в курле исправили на следующий день, похапэшные висят без движения с января.
 

tony2001

TeaM PHPClub
>Тот факт, что функция crc32() на 32-битной платформе отдаёт 32-битное число, а на
>64-битной --- 64-битное, которое может не влезть в 32 бита, он кагбэ очевиден из самого названия функции.

вот именно про это я и говорю - понятие "UNSIGNED INTEGER" недоступно идиотам, это из области высшего знания.

>Просто кагбэ сделать одинаковое возвращаемое значение на любой платформе

вот завтра, как проснешься, сразу начинай заниматься имплементацией 64bit integers на 32bit процах.

>добавить в crc32() вторым параметром константы CRC32_PLEASE_RETURN_SIGNED и CRC32_I_CRAVE_ASSWARDS_COMPATIBILITY

мануал прочти уже, клоун.
там для специально для тупеньких описано как получить unsigned int из signed.

>Да, tony2001, когда я делал HTTP_Request2, я нашёл одну проблемку в curl'е и
>парочку --- в похапэ. Баг в курле исправили на следующий день, похапэшные висят
>без движения с января.

я принимаю только валюту и рубли, лузерские сопли можете оставить себе.
 

Wicked

Новичок
tony2001
вот завтра, как проснешься, сразу начинай заниматься имплементацией 64bit integers на 32bit процах.
казалось бы, причем тут это? :) ты все еще следишь за темой разговора?

речь идет только о том, что сама функция crc32 должна внутри себя делать "$crc = $crc & 0xffffffff;", и все.

Sad Spirit
+1
 

weregod

unserializer
всё-таки аргумент для crc32 было бы полезно добавть
[offtop]
этот баг какбэ всем рано или поздно становится известен
а вот то, что толи с PHP 5.2.7, толи с PHP 5.2.8 в коде, зеженным zend-encoder версии 3, память жутко течь начинает, это относительный свежачек ;)
[/offtop]
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Тони, на тебя лично никто не нападает и твоих заслуг не преуменьшает. И на честь мундира тоже никто не посягает.
PHP - действительно "недоязык" потому что это не язык программирования, а хорошее средство веб-разработки.

PHP далеко неидеален, это факт и все тут. Sad Spirit не клоун просто потому что называет кошку кошкой, и ты не крайний, чтоб отвечать за все.

Да, ф-я работает нелогично. Ты сам писал - название должно отражать суть.
Когда-нибудь исправят. Верю, что есть задачи важнее.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: tony2001
>Тот факт, что функция crc32() на 32-битной платформе отдаёт 32-битное число, а на
>64-битной --- 64-битное, которое может не влезть в 32 бита, он кагбэ очевиден из самого названия функции.

вот именно про это я и говорю - понятие "UNSIGNED INTEGER" недоступно идиотам, это из области высшего знания.

>Просто кагбэ сделать одинаковое возвращаемое значение на любой платформе

вот завтра, как проснешься, сразу начинай заниматься имплементацией 64bit integers на 32bit процах.

>добавить в crc32() вторым параметром константы CRC32_PLEASE_RETURN_SIGNED и CRC32_I_CRAVE_ASSWARDS_COMPATIBILITY

мануал прочти уже, клоун.
там для специально для тупеньких описано как получить unsigned int из signed.
Не-не-не, tony2001, не спрыгнешь, мне не нужны 64-битные целые на 32-битной платформе, а unsigned int в похапэ нету. Мне нужно буквально следующее (на проблему с crc32() я таки тоже напарывался):
  • Чтобы функция crc32() отдавала при одних и тех же входных данных одно и то же значение на 32-битной и 64-битной платформе. Так как очевидно, что на 32-битной много не сделаешь (напоминаю: в пых-пыхе нету unsigned int), то, вероятно, на 64-битной надо выплёвывать отрицательные числа.
  • Если по каким-то причинам предыдущий пункт не прокатывает, то в документации должно быть явно обозначено: "функция по-разному работает на 32-битных и 64-битных платформах, для обхода нашего косяка надо сделать следующие действия". Мысль о том, что это можно прочитать между строк / в камментах в текущей документации, почему-то не кажется мне адекватной.

Кагбэ все мы знаем, что разработчики похапэ головой, перед тем как сесть разрабатывать, не думают. Ну будет ещё одно подтверждение, ну и чё?

>Да, tony2001, когда я делал HTTP_Request2, я нашёл одну проблемку в curl'е и
>парочку --- в похапэ. Баг в курле исправили на следующий день, похапэшные висят
>без движения с января.

я принимаю только валюту и рубли, лузерские сопли можете оставить себе.
Вот за это вас и не любят, бгыгыгы.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Sad Spirit, про "рубли и валюту" Тони на самом деле прав.
Никто не обязан, PHP поставляется "как есть".

Агрессивные ответы разработчиков прямо связаны с популярностью.
Толпы ламеров выливают ведра дерьма за то, что нельзя грабить корованы.
Разработчики совсем даже не стали миллионерами, как почти все сотрудники Microsoft, кроме уборщиков.

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

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

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: grigori
Sad Spirit, про "рубли и валюту" Тони на самом деле прав.
Никто не обязан, PHP поставляется "как есть".
Естественно, но тока разработчикам с завышенным ЧСВ, которых представляет здесь многоуважаемый tony2001, неплохо бы понимать, что если себя вести как архетипичная совковая продавщица --- "вас много, а я одна!" --- то и в обратную сторону отношение будет не очень восторженное.

Да и если бы tony2001 честно написал в ответ на баг-репорт про crc32(): "хочу пару шекелей", а не начал лепить отмазки, что "The integer value differs because of obvious reasons.", до объяснения каковых obvious reasons небожитель не опускается, а начинает хамить (см. выше эту ветку), то уже бы давно и шекели выделили, и баг исправили.

А при таком подходе (см. выше эту ветку) tony2001 никаких шекелей не светит.

Агрессивные ответы разработчиков прямо связаны с популярностью.
Толпы ламеров выливают ведра дерьма за то, что нельзя грабить корованы.
Ну так ставьте начальный фильтр, толстокожего приёмщика баг-репортов. А то если один достаточно толстый тролль может отвлечь кучу разработчиков от разработки к флейму --- хреновые они разработчики.

Разработчики совсем даже не стали миллионерами, как почти все сотрудники Microsoft, кроме уборщиков.
Вот в этом и разница между обычным опенсорсом и его семитским изводом --- в первый идут помогать людям, во второй --- стать миллионером. Ну и тысячелетняя семитская грусть в глазах и прочая фрустрация, если вдруг миллионером стать не получается.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
тяжела и неказиста жизнь народного артиста :)
 

Grezz

Новичок
Автор оригинала: Sad Spirit
Ну да, ну да. Тот факт, что функция crc32() на 32-битной платформе отдаёт 32-битное число, а на 64-битной --- 64-битное, которое может не влезть в 32 бита, он кагбэ очевиден из самого названия функции.
Вы не поверите! (С)

crc32 всегда возвращает 32 бита, другое дело что на 64-х разрядной платформе оно хранится в 64 разрядном int, а там "кагбэ" знаковый бит 63-й а не 31-й.
 

Wicked

Новичок
Grezz
ты к словам попридираться пришел?

лично для меня поведение crc32 сродни тому, что он бы на 32 битной платформе возвращал -2147483648..2147483647, а на 64битной (2**62-2147483648)..(2**62+2147483647). Кагбе да, те же 32 бита, но от этого не легче.
 

Grezz

Новичок
Автор оригинала: Wicked
Grezz
ты к словам попридираться пришел?
Упасите меня святые силы к словам придираться.

Я про то говорю, что описанная проблема не некорректная работа функции, а скорее проблема отображения, я бы даже сказал что это проблема выросшая из привычки "выдавать" пользователю необработанную информацию не задумываясь. Но боюсь меня запинают за "потAкание недумающим головой разработчикам на похапэ".
 

cDLEON

Онанист РНРСlub
При чём здесь "проблема выросшая из привычки "выдавать" пользователю необработанную информацию не задумываясь."
ПХП кроссплатформенный скриптовой язык программирования????
Так какого хрена этот кроссплатформенный язык на разных платформах выдаёт разные результаты?
Зачем плясать с бубном над этими вот "фичами", если можно получать одинаковые результаты? Кому нужна эта "точность" ?
Прошу ответить "защитников", хотя бы, на последний вопрос. Спасибо.
 

Lightning

Трудоголик
cDLEON
А где написано, что PHP кроссплатформенный? Можно линк? Что-то не могу найти...
 
Сверху