Представьте хеш MD5 как целое число

17
задан K-Gun 12 July 2017 в 20:24
поделиться

6 ответов

Будьте осторожны. Для преобразования MD5 в целое число потребуется поддержка больших (128-битных) целых чисел. Скорее всего, API, который вы используете, будет поддерживать только 32-битные целые числа или, что еще хуже, может иметь дело с числами с плавающей запятой. В любом случае ваш идентификатор будет изменен. В этом случае простое назначение второго идентификатора произвольно - гораздо лучший способ справиться с проблемами, чем попытки преобразовать MD5 в целое число.

Однако, если вы уверены , что API может работать с произвольно большими целыми числами без проблем, вы можете просто преобразовать MD5 из шестнадцатеричного в целое число. PHP, скорее всего, не поддерживает эту встроенную функцию, поскольку он попытается представить ее как 32-битное целое число или как плавающую точку; вам, вероятно, потребуется использовать для этого библиотеку PHP GMP .

17
ответ дан 30 November 2019 в 11:32
поделиться

Есть веские причины, заявленные другими, для того, чтобы сделать это по-другому.

Но если вы хотите преобразовать хэш md5 в строку десятичных цифр (именно это, я думаю, вы действительно имеете в виду, "представлять целым числом", поскольку md5 уже является целым числом в строковой форме), и преобразовать его обратно в ту же строку md5:

function md5_hex_to_dec($hex_str)
{
    $arr = str_split($hex_str, 4);
    foreach ($arr as $grp) {
        $dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT);
    }
    return implode('', $dec);
}

function md5_dec_to_hex($dec_str)
{
    $arr = str_split($dec_str, 5);
    foreach ($arr as $grp) {
        $hex[] = str_pad(dechex($grp), 4, '0', STR_PAD_LEFT);
    }
    return implode('', $hex);
}

Demo:

$md5 = md5('example@example.com');
echo $md5 . '<br />';  // 23463b99b62a72f26ed677cc556c44e8
$dec = md5_hex_to_dec($md5);
echo $dec . '<br />';  // 0903015257466342942628374306682186817640
$hex = md5_dec_to_hex($dec);
echo $hex;             // 23463b99b62a72f26ed677cc556c44e8

Конечно, вы должны быть осторожны, используя любую строку, например, убедитесь, что используете их только как строковый тип, чтобы избежать потери ведущих нулей, обеспечивая строки имеют правильную длину и т. д.

10
ответ дан 30 November 2019 в 11:32
поделиться

Почему ord ()? md5 производит обычное 16-байтовое значение, которое отображается в шестнадцатеричном формате для лучшей читаемости. Таким образом, вы не можете преобразовать 16-байтовое значение в 4- или 8-байтовое целое без потерь. Вы должны изменить некоторую часть ваших алгоритмов, чтобы использовать это как идентификатор.

2
ответ дан 30 November 2019 в 11:32
поделиться

You could use hexdec to parse the hexadecimal string and store the number in the database.

1
ответ дан 30 November 2019 в 11:32
поделиться

Не могли бы вы просто добавить еще одно поле, которое было бы полем с автоматическим приращением int?

1
ответ дан 30 November 2019 в 11:32
поделиться

как насчет:

$float = hexdec(md5('string'));

или

$int = (integer) (substr(hexdec(md5('string')),0,9)*100000000);

Определенно больше шансов на столкновение, но все же хорошо использовать вместо хэша в БД?

cheers,

/Marcin

1
ответ дан 30 November 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: