Desde que los ID’s de los estados en Twitter son mayores que la representación de enteros usando 32bits, había estado usando el tipo float
para filtrar rápidamente esos valores, digamos:
$statusid = isset($_GET['statusid']) ? (float)$_GET['statusid'] : 0;
Con float
se pueden tener hasta 14 dígitos sin pasar a la representación exponencial (1.xxxxxxE+NN
), y como Twitter solo estaba generando ID’s de 11 dígitos, me pareció que había bastante tiempo antes de que se pasara el límite de float
. Además me sirve que tenga la representación como número para comparaciones ($lastid > $firstdbid
) o para hacer cálculos sobre estos (etags).
Ahora que Twitter anda generando los ID’s con Snowflake (más información al respecto en el blog de Twitter), cada ID requiere 15 dígitos o más (53bits por ahora).
Esto no es problema si se tiene PHP a 64bits, ya que se pueden tener hasta 19 dígitos antes de alcanzar el límite. Si se tiene PHP compilado a 32bits, no queda de otra más que usar strings
. Un forma rápida para filtrar los IDs tanto para 64bit y 32bit sería:
function safelongint($strint) { $intval = intval($strint); if ( $intval == PHP_INT_MAX) { return preg_replace('/[^0-9]/','',$strint); //eliminar cualquier cosa que no sea dígito } return $intval; }
Aún si los ID’s pasan el límite de los 64bits, debería usar strings automáticamente. Ya solo queda que la base de datos no tenga problemas con números tan grandes 😉 .
Actualización: Al 10 de Noviembre, Twitter ya llegó a los 17 dígitos en los ID’s… a ese paso el límite de los 64bit durará menos de lo que imaginé.