私の要件は、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、および -_ が含まれます。~