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:
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; } Previous Comments: ------------------------------------------------------------------------ [2010-02-17 22:32:04] der...@php.net Instead of a plain echo, you can also do: printf("%u", crc32("884385799717_1_1")); that should output the same string on every platform (that is at least 32bit). The reason why it is different on Windows vs. (any other) Unix, is because on Windows even on 64 bit CPUs, "long" (the data type we use for integers) is still only 32bit; on Unices, the "long" type is usually 64 bit on 64 bit CPUs. ------------------------------------------------------------------------ [2010-02-17 22:23:29] jian at theorchard dot com I certainly understand that it is the signed output of an unsigned value. But when crc32 function is used for checksum purpose, I'm expecting it to return the same checksum value from under different platforms. Apparently, this unsigned representation of a signed integer as the result of the function call has caused a lot of checksum failures in our applications. I would like this behavior to be fixed in upcoming releases. I wouldn't have created this bug report if I could find my solution or existing reports that you already have. If you can provide me with the bug numbers of the other bug reports you mentioned, I'd be more than happy to study them. Thank you very much. ------------------------------------------------------------------------ [2010-02-17 18:21:04] paj...@php.net It is the signed output of an unsigned value. The values are correct (there was other bug reports about this, check them to get a more verbose explanation). ------------------------------------------------------------------------ [2010-02-17 17:47:22] jian at theorchard dot com Description: ------------ According to bug# 36306, this issue should have been fixed. But I found it not entirely fixed across all platforms. crc32 is returning an unsigned integer on a 64-bit Linux platform. It does return the signed integer from a 64-bit Windows platform as well as 32-bit Windows/Linux platforms. I found PHP_INT_SIZE and PHP_INT_MAX constants have different values on that 64-bit Linux server with values 8 and 9223372036854775807 respectively. They are 4 and 2147483647 on other 32-bit platforms and 64-bit Windows platform. Reproduce code: --------------- <? echo crc32("884385799717_1_1") . "\n"; ?> Expected result: ---------------- I expect to see value -676770709 both on 32-bit and 64-bit platforms. Actual result: -------------- On 64-bit Linux platform I see 3618196587 On 64-bit Windows platform I see -676770709 On 32-bit platforms I see -676770709 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=51073&edit=1