如何在PHP中将查询字符串转换为较短的字母数字字符串(并再次转换回)?

如何在PHP中将查询字符串转换为较短的字母数字字符串(并再次转换回)?,php,function,hash,Php,Function,Hash,我希望将当前URL的查询字符串存储为较短的字母数字字符串,并能够将其转换回原始查询字符串 例如: inputType=timeline&count=50&hashtag=%23li&filtersspecifiedhashtag=1&filtershashtagsend=1&filterscreennames=1&extracturl=1&deshortifyurl=1&filterurls=1 我希望能够使用生成的字母数字字符串作为文件名 我希望避免使用MYSQL或将值存储在文本文件中 有没有

我希望将当前URL的查询字符串存储为较短的字母数字字符串,并能够将其转换回原始查询字符串

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

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

我希望避免使用MYSQL或将值存储在文本文件中


有没有一种方法可以转换为字母数字字符串并将其转换回原始查询字符串?我对散列不是很了解,但想知道某种“双向散列”技术是否可行?

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

您要查找的不是散列,因为散列在常见情况下是单向函数。 下面是一个可能的解决方案-同时使用base64加密和类似参数映射的方法,这样您将能够获得更短的文件名,因为您不存储参数名,只存储值:

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,所以在我的情况下它是可以的)

您可以使用session@DevZer0-我不想这样做,因为它将在cron作业的后台运行。谢谢。我想我理解你方法背后的思想,尽管我不理解代码本身。我得到了一个
解析错误:语法错误,第3行出现了意外的“[”
错误。您能解释一下这里应该发生什么吗?啊,是的。我正在使用PHP5.5;通过[…]使用短数组语法从5.4版开始提供-似乎您需要更新您的PHPThanks以进行更新,我想知道您使用的是哪种魔法!;-)不幸的是,由于一些原因,我无法将我的PHP升级到5.5,但更重要的是,我正在编写的应用程序需要在所有版本的v5中工作,否则我会有很多不开心的人ike我将不得不查找短数组语法,因为我还没有遇到这个问题。只需将
[…]
替换为
数组(…)
谢谢,我认为这是一个非常好的方法。最后我决定将字符串存储在文本文件中(尽管最初希望避免使用此方法)因为它使我能够在我的项目中做一些其他事情。再次感谢!