Я не знаю, как это исправить, но мне кажется, я знаю, почему это происходит. Никаких ошибок здесь - прямо из руководства http://php.net/manual/en/function.dechex.php
Наибольшее число, которое можно преобразовать, - это 4294967295 в десятичном виде, в результате чего получается "ffffffff"
Я не знаю, что именно происходит «внутри» php, но вы, вероятно, вызываете переполнение 32-битного целого без знака (12 345 678 900> 4 294 967 295). Поскольку в 64-разрядной системе этот предел должен составлять 18 446 744 073 709 551 615, dechex возвращает «правильные» значения (32-разрядная разница по сравнению с 64-разрядной не представляется документированной, и я могу ошибаться, поскольку у меня нет 64-разрядной системы для тестирования).
// Изменить:
В качестве последнего средства вы можете использовать расширение GMP , чтобы создать собственную функцию hecdex для 32-битной системы, но это приведет к огромным накладным расходам. Вероятно, это будет одна из самых медленных реализаций, известных современному программированию.
// Edit2:
Написал функцию, используя BCMath , я сейчас на Windows и изо всех сил пытался найти правильную dll для GMP.
function dechex32($i) {
//Cast string
$i = (string)$i;
//Initialize result string
$r = NULL;
//Map hex values 0-9, a-f to array keys
$hex = array_merge(range(0, 9), range('a', 'f'));
//While input is lagrer than 0
while(bccomp($i, '0') > 0) {
//Modulo 16 and append hex char to result
$r.= $hex[$mod = bcmod($i, '16')];
//i = (i - mod) / 16
$i = bcdiv(bcsub($i, $mod), '16');
}
//Reverse result and return
return strrev($r);
}
var_dump(dechex32(12345678900));
/*string(9) "2dfdc1c34"*/
Тщательно не проверял, но, кажется, работает. Использование в качестве последнего средства - грубый тест с 100 000 итераций показал, что он примерно в 40 раз медленнее, чем собственная реализация.