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 に答える