0

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

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

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

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

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

4

2 回答 2

0

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

于 2013-08-08T07:52:33.933 回答
0

您正在寻找的不是散列 - 因为散列在常见情况下是一种单向函数。这是一个可能的解决方案 - 同时使用 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,所以在我的情况下没关系)

于 2013-08-08T07:59:41.783 回答