我想要的是将整数转换为字符串。例如,123456789可能会成为8GFsah93r ...你知道像Youtube,Pastebin等等。然后我想把它转换回来。
我正在使用大整数,例如:131569877435989900
请看一下这个链接:http://codepad.viper-7.com/wHKOMi
这是我尝试使用我在网络上找到的功能,显然......它没有正确转换回整数。我需要能够做到这一点的事情。
由于
答案 0 :(得分:3)
好的,其中一个想法是使用字符数组作为数字系统的表示。然后,您可以从 base 10转换为base x ,反之亦然。该值将更短且可读性更低(如果它必须是安全的,那么你应该使用双向加密器加密)。
解决方案:
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);
如果这里遗漏了什么,请告诉我,因为它只是我图书馆的片段(我不想在这里插入整个内容)
内格拉
答案 1 :(得分:2)
检查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。
答案 2 :(得分:0)
为什么不使用这样的东西?你需要大量加密吗?
$num = 131569877435989900;
echo $str = base64_encode($num);
echo base64_decode($str);
答案 3 :(得分:0)
我认为您想要的是使用Base32对ID进行编码。结果字符串仅包含26个字母和数字2-7,使其非常易读。
答案 4 :(得分:0)
最简单的方法是使用像base_convert
这样的东西 - 不幸的是,它不适用于如此大的整数。
但是,您可以通过从我的回答here复制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
替换为更大的基数{(您可以将其定义为已定义的数字),并且它将像您希望的那样工作。
答案 5 :(得分:0)
我很惊讶没有人提到base64_encode()和它的伙伴base64_decode()。
如果你不考虑长度这是完美的
$before = base64_encode(131569877435989900);
$after = 'MS4zMTU2OTg3NzQzNTk5RSsxNw==';
$on_reverse = base64_decode('MS4zMTU2OTg3NzQzNTk5RSsxNw==');
$on_reverse == 131569877435989900;
我总是选择最简单的解决方案,只要它们不损害我的安全性。
答案 6 :(得分:-1)
获取随机字符串的最简单方法是使用散列函数,例如md5()
或sha1()
例如:
<?php
$bigInt = '131569877435989900';
$hash = md5($bigInt);
$hashed=substr($hash,0,-20);
echo $hashed;
?>
这些哈希函数是不可逆的 - 您无法获得原始值(这些函数也用于加密数据)。如果需要,可以将原始大整数保存在数组或数据库中。但是描述哈希是不可能的。