如何在PHP中将查询字符串转换为更短的字母数字字符串(并将其转换回来)?

时间:2013-08-08 07:30:34

标签: php function hash

我想将当前网址的查询字符串存储为较短的字母数字字符串,并能将其转换回原始查询字符串。

例如: inputType=timeline&count=50&hashtag=%23li&filterspecifiedhashtag=1&filterhashtagsend=1&filterscreennames=1&extracturl=1&deshortifyurl=1&filterurls=1

我希望能够将生成的字母数字字符串用作文件名。

我想避免使用MYSQL或在文本文件中存储值。

有没有办法转换为字母数字字符串以及能够将其转换回原始查询字符串?我不是很了解哈希,但想知道某种“双向哈希”技术是否可行?

2 个答案:

答案 0 :(得分:0)

你可以使用base64_encode()和base64_decode(),但是如果你想要它作为文件名,你可能会达到文件系统的文件名长度限制(ext3的255个字符)。如果您可以达到此限制,则可以将每个X字符用作目录名称,并创建完整路径。

答案 1 :(得分:0)

您所寻求的不是哈希 - 因为哈希是常见情况下的单向函数。 这是一个可能的解决方案 - 使用base64加密和类似参数map之类的东西,这样你就可以获得更短的文件名,因为你不会存储参数名,只有值:

class Holder
{
   const NAME_PARAM_DELIMIER = '|';

   public static function getParametersMap()
   {
      return [
        0 => 'count',
        1 => 'deshortifyurl',
        2 => 'extracturl',
        3 => 'filterhashtagsend',
        4 => 'filterscreennames',
        5 => 'filterspecifiedhashtag',
        6 => 'filterurls',
        7 => 'hashtag',
        8 => 'inputType',
      ];
   }

   public static function getParamsByName($sName, $bReturnAsArray=true)
   {
      $rgParams = @array_combine(self::getParametersMap(), explode(self::NAME_PARAM_DELIMIER, base64_decode($sName)));
      if(!is_array($rgParams))
      {
         return null;
      }
      return $bReturnAsArray?$rgParams:http_build_query($rgParams);
   }

   public static function getNameByParams($sQuery)
   {
      parse_str($sQuery, $rgParams);
      ksort($rgParams);
      return base64_encode(join(self::NAME_PARAM_DELIMIER, array_values($rgParams)));
   }
}
$sQuery = 'inputType=timeline&count=50&hashtag=%23li&filterspecifiedhashtag=1&filterhashtagsend=1&filterscreennames=1&extracturl=1&deshortifyurl=1&filterurls=1';

$sName  = Holder::getNameByParams($sQuery);
$rgData = Holder::getParamsByName($sName);
var_dump($sName); //NTB8MXwxfDF8MXwxfDF8I2xpfHRpbWVsaW5l
var_dump($rgData);

另请注意,base64会产生“=”符号 - 我不确定它是否允许在所有文件系统上使用(我使用的是Reiser,所以在我的情况下也没问题)