Превращение целого числа в случайную строку и обратно - PullRequest
6 голосов
/ 12 сентября 2011

я хочу преобразовать целое число в строку.Например, 123456789 может стать 8GFsah93r ... вы знаете, как Youtube, Pastebin, а что нет.Затем я хочу преобразовать его обратно.

Я работаю с большими целыми числами, например: 131569877435989900

Посмотрите по этой ссылке: http://codepad.viper -7.com /wHKOMi

Это моя попытка использовать функцию, которую я нашел в Интернете, очевидно ... она не правильно конвертирует обратно в целое число.Мне нужно что-то, что делает это реально.

Спасибо

Ответы [ 7 ]

3 голосов
/ 12 сентября 2011

Хорошо, одна из идей - использовать массив символов в качестве представления числовой системы .Затем вы можете конвертировать из база 10 в базу х и наоборот.Значение будет короче и менее читаемым (хотя вы должны зашифровать с помощью двустороннего шифратора, если оно должно быть безопасным).

Решение:

final class UrlShortener {

    private static $charfeed = Array(
    'a','A','b','B','c','C','d','D','e','E','f','F','g','G','h','H','i','I','j','J','k','K','l','L','m',
    'M','n','N','o','O','p','P','q','Q','r','R','s','S','t','T','u','U','v','V','w','W','x','X','y','Y',
    'z','Z','0','1','2','3','4','5','6','7','8','9');

    public static function intToShort($number) {
        $need = count(self::$charfeed);
        $s = '';

        do {
            $s .= self::$charfeed[$number%$need];
            $number = floor($number/$need);
        } while($number > 0);

        return $s;
    }

    public static function shortToInt($string) {
        $num = 0;
        $need = count(self::$charfeed);
        $length = strlen($string);

        for($x = 0; $x < $length; $x++) {
            $key = array_search($string[$x], self::$charfeed);
            $value = $key * pow($need, $x);
            $num += $value;
        }

        return $num;
    }
}

Тогда вы можете использовать:

UrlShortener::intToShort(2);
UrlShortener::shortToInt("b"); 

РЕДАКТИРОВАТЬ

с большими числами, это не работает.Вы должны использовать эту версию (с bcmath http://www.php.net/manual/en/book.bc.php) с очень большими числами:

final class UrlShortener {

    private static $charfeed = Array(
    'a','A','b','B','c','C','d','D','e','E','f','F','g','G','h','H','i','I','j','J','k','K','l','L','m',
    'M','n','N','o','O','p','P','q','Q','r','R','s','S','t','T','u','U','v','V','w','W','x','X','y','Y',
    'z','Z','0','1','2','3','4','5','6','7','8','9');

    public static function intToShort($number) {
        $need = count(self::$charfeed);
        $s = '';

        do {
            $s .= self::$charfeed[bcmod($number, $need)];
            $number = floor($number/$need);
        } while($number > 0);

        return $s;
    }

    public static function shortToInt($string) {
        $num = 0;
        $need = count(self::$charfeed);
        $length = strlen($string);

        for($x = 0; $x < $length; $x++) {
            $key = array_search($string[$x], self::$charfeed);
            $value = $key * bcpow($need, $x);
            $num += $value;
        }

        return $num;
    }
}
$original = 131569877435989900;
$short = UrlShortener::intToShort($original);
echo $short;
echo '<br/>';
$result = UrlShortener::shortToInt($short);
echo $result;
echo '<br/>';
echo bccomp($original, $result);

Если что-то здесь не хватает, пожалуйста, дайте мне знать, потому что это всего лишь фрагмент из моей библиотеки (яне хочу вставлять все это здесь)

negra

2 голосов
/ 12 сентября 2011

проверьте кодировку base64: http://php.net/manual/en/function.base64-encode.php http://php.net/manual/en/function.base64-decode.php

Если вы хотите, чтобы более короткая строка сначала кодировала ее в 8-битную строку, а затем кодировала.Вы можете сделать это с помощью % 256 и / 256.

Или вы можете вручную сделать то, что делает base64, получить первые 6 бит и закодировать его в символ.

0 голосов
/ 11 сентября 2013

Я удивлен, что никто не упоминает base64_encode () и его партнера base64_decode ().
Если вы не учитываете длину, это идеально

$before = base64_encode(131569877435989900);

$after = 'MS4zMTU2OTg3NzQzNTk5RSsxNw==';

$on_reverse = base64_decode('MS4zMTU2OTg3NzQzNTk5RSsxNw==');
$on_reverse == 131569877435989900;

Я всегда использую самые простые решения, если они не ставят под угрозу мою безопасность.

0 голосов
/ 12 сентября 2011

Самое простое было бы использовать что-то вроде base_convert - к сожалению, оно не будет работать правильно для таких больших целых чисел.

Однако вы можете использовать ту же идею,скопировать base_convert_arbitrary из моего ответа здесь и сделать:

$id = '131569877435989900';
$encoded = base_convert_arbitrary($id, 10, 36);
$decoded = base_convert_arbitrary($encoded, 36, 10);

print_r($encoded);
print_r($decoded);

увидеть его в действии .

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

$digits = '0123456789abcdefghijklmnopqrstuvwxyz'; // 36 "digits"

Добавьте любые другие "цифры", которые вы считаете приемлемыми (например, заглавные буквы или другие символы, которые вам не нравятся).имея в своем URL).Затем вы можете заменить основание 36 в вышеприведенном примере на большее (вы можете подняться до заданных цифр), и оно будет работать так, как вы хотите.

Смотрите здесь, работая с 62 цифрами .

0 голосов
/ 12 сентября 2011

Я думаю, что вы хотите, чтобы кодировать идентификаторы, используя Base32 .Результирующая строка содержит только 26 букв алфавита и цифры 2-7, что делает ее очень удобочитаемой для человека.

0 голосов
/ 12 сентября 2011

Самый простой способ получить случайную строку - использовать хеш-функции, такие как md5() или sha1() Например:

<?php
$bigInt = '131569877435989900';
$hash = md5($bigInt);
$hashed=substr($hash,0,-20);
echo $hashed;
?>

Эти хеш-функции необратимы - вы не можете получить исходное значение (эти функции также используются для шифрования данных). Если вы хотите, вы можете сохранить исходное большое целое число в массиве или базе данных. Но расшифровка хэша была бы невозможна.

0 голосов
/ 12 сентября 2011

Почему бы не использовать что-то подобное?Вам это нужно в зашифрованном виде?

$num = 131569877435989900;
echo $str = base64_encode($num);
echo base64_decode($str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...