3

PHP で次のことを最適に行う方法がわかりません: データベースに、19041985 のような一意の ID を持つメッセージがあります。これらのメッセージを短い URL サービスで参照したいのですが、生成されたハッシュは使用しません。ただし、元の ID を単に「計算」するだけです。

つまり、例: http://short.url/sYsn7 では、訪問者が要求したいメッセージ ID を計算できます。

より明確にするために、これらの「英数字 ID バージョン」を生成するために PHP で次のように記述しました。もちろん、逆の方法で元のメッセージ ID を計算できます。

問題は、これが最適な方法かどうかです。私はそうは思いませんが、それ以外は考えられません。

$alphanumString = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_';
for($i=0;$i < strlen($alphanumString);$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}



$id = 19041985;

$out = '';
for($i=0;$i < strlen($id);$i++) {

 if(isset($alphanumString["".substr($id,$i,2).""]) && strlen($alphanumString["".substr($id,$i,2).""]) > 0) {
  $out.=$alphanumString["".substr($id,$i,2).""];
 } else {
  $out.=$alphanumString["".substr($id,$i,1).""];
  $out.=$alphanumString["".substr($id,($i+1),1).""];
 }
 $i++;
}

print $out;
4

2 に答える 2

1
echo trim(base64_encode(pack("L", 19041987)), "=");
print_r(unpack("L", base64_decode("w44iAQ")));
  • Pack は数値を 4 バイトに変更します。これは非常に短いですが判読できません。
  • Base64_encode は、4 バイトを人間が判読できる文字に変更します。
  • 必要のない = 文字を追加します。

base64_encode(19041987) を実行すると、文字列 "19041987" のエンコードが取得されますが、これは短くはありません。

于 2010-06-08T12:06:49.083 に答える
-1

関数はループごとに再生されるため、for ステートメント内で関数を使用しないでください。

たとえば、あなたの

for($i=0;$i < strlen($alphanumString);$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}

する必要があります

var $alphaLength = strlen($alphanumString);
for($i=0;$i < $alphaLength;$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}
于 2010-06-08T12:13:57.250 に答える