1

私の要件は、20 文字の長さの http セッション ID を文字列値としてサードパーティのスクリプトに送信することです。したがって、Java では HttpServletRequest を取得し、次に HttpSession を取得し、最後に 32 文字の長さで、この 2A5B2EF7B388159A6E5A7C038F6B694F のような ID を取得します。

今私の質問に:私はセッションIDを最大値としてしか渡すことができないので. 20 文字の長い URL エンコード文字列 ID を短くする必要があることは明らかです。競合の可能性をあまり上げずに ID を短くするにはどうすればよいですか?

IDが本当にランダムな場合、理論的には20文字に切り詰めることができますか? しかし、この ID がどのように生成されるのか正確にはわからないため、ID を 20 文字に分割するハッシュ関数を使用する方がよい場合があります。

この特定のケースで私を助けることができるハッシュ関数またはHttpSession IDに関する詳細情報について何か提案はありますか?

前もって感謝します。

編集 ID/パラメータは URL エンコードする必要があることを忘れていました。このアプローチはどうですか:

予約されていないパーセント エンコーディング文字をすべて含む char[] 配列を作成します。予約済みの文字はエンコード時に最大 3 つのスロットを使用するため、予約されていない文字のみを使用します。たとえば、'/' は '%2F' です。

次に、16 進文字列からバイト配列を作成します。これにより、byte[16] が得られます。次に、バイトの値が (ラップアラウンドで) char[] 配列に、許可された文字でマップされます。

StringBuilder shortenedSessionId = new StringBuilder();
char[] data = sid.toCharArray();
byte[] decodedHexData = Hex.decodeHex(data);

for (byte b : decodedHexData) {
    char mappedChar = allowedSessionIdChars[(b & 0xFF) % allowedSessionIdChars.length];
    shortenedSessionId.append(mappedChar);
}

char[] allowedSessionIdChars には、文字 A ~ Z、a ~ Z、0 ~ 9、および -_ が含まれます。~

4

1 に答える 1

5

16 進文字列の各 2 文字は、正確に 1 バイトに収まります。したがって、出力の各文字は、実際には 2 つの入力文字を保持できます。次のように、入力文字列をトラバースするだけです dst[i] = (src[2*i] << 8) + src[2*i+1]。入力サイズが 36 の場合、18 文字の文字列が得られます。これは、1 バイトに詰め込むことができる最大値であるため、取得できる最大のロスレス圧縮です。

于 2012-11-21T10:12:34.720 に答える