Косяк base_convert()

Фанат

oncle terrible
Команда форума
У кого есть свежая версия пхп под руками, выполните, плиз,
PHP:
$md5  = "6246aa1d3c5cc94ef0df01e3f6feba09";
$name = base_convert($md5,  16, 36);
$back = base_convert($name, 36, 16);
var_dump(PHP_VERSION,PHP_INT_SIZE,$name,$back);
и покажите, что получилось?
 

Redjik

Джедай-мастер
Встречал, там в описании на php.net написаны способы решения...
 

Вурдалак

Продвинутый новичок
http://ru2.php.net/manual/en/function.base-convert.php
base_convert() may lose precision on large numbers due to properties related to the internal "double" or "float" type used. Please see the Floating point numbers section in the manual for more specific information and limitations.
P.S.
string(17) "5.3.10-1ubuntu3.2"
int(8)
string(25) "5tgcykhf1eo08kgo08gk4kgc8"
string(32) "6246aa1d3c5ccc000000000000000000"
 

Фанат

oncle terrible
Команда форума
Спасибо.
Ну, в общем, понятно.
Мда, я почему-то относился к ней, как с строковой функции, по инерции.
 

Фанат

oncle terrible
Команда форума
Это я имя файла из содержимого генерю %)
Экономит helluvalot of space, кстати, сам подход - не приходится хранить кучу дублей.
А в 36 - чтобы имена файлов были покороче и не такие скучные :)

собственно, обратная конвертация мне не нужна
просто на 32- и на 64-битных системах разный результат. Написал об этом в жж, а Болк попросил посмотреть, как обратно кодирует - тут мне и самому стало интересно.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
<?php
/**
 * This is base_convert implementation that is able to support more than 31 bit integers
 *
 * @param $num
 * @param $base_a
 * @param $base_b
 * @return string
 */
function gmp_convert($num, $base_a, $base_b)
{
    return gmp_strval (gmp_init($num, $base_a), $base_b );
}
:)
 

fixxxer

К.О.
Партнер клуба
А чем банальный strtolower(base64(md5(..., true)) не подходит? Вероятность, что при приведении к lowerrcase будет конфликт, немногим выше вероятность коллизии ;) а если забить на windows то вообще можно без strtolower.
 
Сверху