java - 将 32 个字符的 http session ID 缩短为 20 个字符(截断?散列?)

标签 java http function session hash

我的要求是将 20 个字符长的 http session ID 作为字符串值发送到第 3 方脚本。所以在 Java 中,我得到 HttpServletRequest,然后得到 HttpSession,最后是 32 个字符长的 ID,看起来像这样 2A5B2EF7B388159A6E5A7C038F6B694F。

现在回答我的问题: 因为我最多只能传递 session ID。 20 char long url encoded string 我显然需要缩短 ID。如何缩短 ID 而不会增加太多冲突的可能性?

如果 ID 真的是随机的,我理论上可以将其截断为 20 个字符,对吗?但由于我不完全知道这个 ID 是如何生成的,所以使用将 ID 分解为 20 个字符的哈希函数可能会更好。

对于散列函数或 HttpSession ID 的更多信息,您是否有任何建议可以在这种特定情况下帮助我?

提前致谢。

编辑 我忘了提到 id/参数必须是 url 编码的。这种方法怎么样:

我创建了一个 char[] 数组,其中包含所有未保留的百分比编码字符。我只使用未保留的字符,因为保留的字符在编码时最多占用 3 个插槽: 例如'/' 是 '%2F'

然后我用十六进制字符串创建一个字节数组,它给了我一个字节[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 and -_.~

最佳答案

十六进制字符串中的每 2 个字符都完全适合一个字节。所以输出中的每个字符实际上可以容纳 2 个输入字符。只需遍历输入字符串,就像这样: dst[i] = (src[2*i] << 8) + src[2*i+1] .对于大小为 36 的输入,您将得到一个 18 个字符的字符串。这是您可以获得的最大无损压缩,因为这是您可以填充到单个字节中的最大值。

关于java - 将 32 个字符的 http session ID 缩短为 20 个字符(截断?散列?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13490671/

相关文章:

http - 如何在谷歌浏览器中禁用 SPDY

c++ - 使用 VS2013 express 在 Windows 8.1 上构建 cpprest (Casablanca)

swift - 显示帮助文本以了解 Swift 中函数的功能

java - Spring 4 Websocket - 没有任何反应

java - 没有这样的方法错误: <init> when using rJava to create a new object

c++ - libcurl:curl_easy_perform block ,除非设置了 CURLOPT_READFUNCTION

php - PHP 中每个文件只有一个或多个函数?

python - 将函数应用于已有的日期列

java - 找不到方法 classpath() 错误

java - 使用 selenium webdriver java 无法在 IE8 中找到元素