ID: 51073 User updated by: jian at theorchard dot com Reported By: jian at theorchard dot com Status: Bogus Bug Type: Feature/Change Request Operating System: Linux RHEL 5 PHP Version: 5.3.1 New Comment:
Did you not read my previous post? That's the same exactly function I have already posted. Yes, it is very stupid to have to do that on the user's end. Previous Comments: ------------------------------------------------------------------------ [2010-02-19 05:15:56] ras...@php.net Why can't you always use a signed checksum if that is what you want? crc32 simply returns 32 bits. You always get the same 32 bits regardless of the platform. If you want to always represent that as a signed 32-bit integer, then do so. The fact that some platforms have the ability to show those 32 bits without messing up the sign is irrelevant. Just emulate it with something stupidly simple like: $max32 = 2147483648; $crc = crc32("884385799717_1_1"); if($crc>$max32-1) { $crc = $crc-2*$max32; } echo $crc; ------------------------------------------------------------------------ [2010-02-19 04:20:00] jian at theorchard dot com All I was saying is to point out that crc32 function is unable to return the same result represented in the same way under any different platforms. The documentation does say to use sprintf function to format the result to be an unsigned integer in order to the get same expected result from all platforms. In the real world, we actually do need to use signed checksum in some cases. So with this shortcoming in mind, crc32 function cannot achieve a truly signed checksum purpose. ------------------------------------------------------------------------ [2010-02-18 08:34:59] ras...@php.net It does return the correct set of bits. Anything we do to change what is currently being returned will seriously confuse everyone and the documentation is quite clear on this. ------------------------------------------------------------------------ [2010-02-18 08:26:44] jian at theorchard dot com On a second thought, however, this still poses an issue. As a programmer, I shouldn't be worreid about all these reformatting and work-arounds. If my function returns me a chicken under development environment, it shouldn't return me an egg once it's released to the production environment. Even though it's the same value, they should also be represented in the same way regardless which platform this function is used. This issue should still be classified as a valid bug in my opinion. ------------------------------------------------------------------------ [2010-02-17 22:38:09] jian at theorchard dot com Thanks Derick. That was much more helpful. Unfortunately, I cannot use unsigned integer as our checksum. It has to be signed. I do in fact have a work around function built to solve this issue. I was just wondering whether this will get fixed in the future or not. Since it's a platform dependent issue, it most likely won't get fixed I think. Below is the function I have posted against the crc32 function as a note. I hope this can help others out. Thanks again. function get_signed_int($in) { $int_max = pow(2, 31)-1; if ($in > $int_max){ $out = $in - $int_max * 2 - 2; } else { $out = $in; } return $out; } ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/51073 -- Edit this bug report at http://bugs.php.net/?id=51073&edit=1