我的要求是将 20 个字符长的 http 会话 ID 作为字符串值发送到第 3 方脚本。所以在Java中我得到HttpServletRequest,然后得到HttpSession,最后得到32个字符长的ID,看起来像这样2A5B2EF7B388159A6E5A7C038F6B694F。
现在我的问题是:因为我只能将会话 ID 作为最大值传递。20 字符长的 url 编码字符串我显然需要缩短 ID。如何在不增加太多冲突机会的情况下缩短 ID?
如果 ID 真的是随机的,我理论上可以将其截断为 20 个字符,对吗?但由于我不完全知道这个 ID 是如何生成的,所以最好使用一个散列函数,将 ID 分解为 20 个字符。
您对哈希函数或有关 HttpSession ID 的更多信息有什么建议,可以在这种特定情况下帮助我吗?
提前致谢。
编辑 我忘了提到 id/参数必须是 url 编码的。这种方法怎么样:
我创建了一个包含所有未保留百分比编码字符的 char[] 数组。我只使用未保留的字符,因为保留的字符在编码时最多占用 3 个插槽:例如 '/' is '%2F'
然后我从十六进制字符串中创建一个字节数组,它给了我一个 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 包含字母 AZ、aZ、0-9 和 -_.~