On Fri, Aug 30, 2013 at 10:29 AM, Rasmus Schultz <ras...@mindplay.dk> wrote:
> No replies probably means no one cares. oh well.
>
> For the record, the examples I posted are wrong - the correct way to
> convert the long values consistently appears to be:
>
> list($v) = array_values(unpack('l', pack('l', ip2long('255.255.255.0'))));
>
I had spotted the error, but didn't want to reply because I don't
really understand what you are getting at.

The core issue is that PHP doesn't provide a 32-bit unsigned integer
on a 32-bit platform ... and/or that the size of integer changes
depending on the platform. But I doubt that is going to change any
time soon. Crippling 64-bit systems due to old, legacy 32-bit
platforms is shortsighted.

What's wrong with the manual's approach?

$checksum = sprintf("%u", crc32("The quick brown fox jumped over the
lazy dog."));

Are you going to do further mathematical operations on it? You can
take that string and stuff it into an uint32 field into a db without
an issue.

At the end of the day, there's no getting around that PHP programmers
need to be aware of the difference between 32-bit and 64-bit systems
... it affects far more than these two particular functions.

But if these two functions are particularly bothersome, a better "fix"
IMO is just:

$crc = crc32("12341234", CRC32_UINT32_STRING);

Where the second parameter is CRC32_INT (default & current behavior),
CRC32_INT32 (always negative if high bit is set), CRC32_UINT32_STRING,
CRC32_HEX_STRING

Forgive the poor names.

--
Matthew Leverton

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to