gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:52:20 27 4
gpt4 key购买 nike

我的要求是将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com