Превращение целого числа в случайную строку и обратно

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

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

Взгляните на эту ссылку: http://codepad.viper-7.com/wHKOMi

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

благодаря

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

Решение:

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); 

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

негра

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

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

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

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

 $num = 131569877435989900; echo $str = base64_encode($num); echo base64_decode($str); 

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

Простейшим было бы использовать что-то вроде 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 цифрами .

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

 $before = base64_encode(131569877435989900); $after = 'MS4zMTU2OTg3NzQzNTk5RSsxNw=='; $on_reverse = base64_decode('MS4zMTU2OTg3NzQzNTk5RSsxNw=='); $on_reverse == 131569877435989900; 

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

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

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

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