我有一个消息传递系统,该系统使用REST,Websockets和磁盘上的文件在连接的两侧都使用Java传递消息。然后,将发送的消息用作安全性令牌,以查询各种索引和数据库,这在这里至关重要。我已经考虑过将Long作为字节数组之类的Base64.encodeBase64()之类的东西,但这是区分大小写的,而且在空间方面也没有太多节省。我曾考虑过将其转换为hex和toString(),但相比起来节省的很少。我希望对这样的事情有一个行业标准,或者我很不幸,成为一个白痴,忽视了很明显的事情,或者使用了错误的语言。只要在令牌的另一端照原样使用令牌,就没有实际的解码要求,它必须是唯一,可重复,可靠且较小的。
我必须能够以纯字符串形式发送令牌
我必须能够重复地将Long编码为字符串
令牌必须不区分大小写(a == A)
令牌必须尽可能压缩,大小很重要
Long值没有前导0,没有负数,没有小数位
答案 0 :(得分:2)
仅当您区分大小写时,才适合使用Base64。
从根本上讲,您需要确定可以用作符号集的字符数,这确定字符串的紧凑程度。符号越多,字符串就越紧凑。
听起来您可以使用所有大写字母和所有数字字母。这将为您提供36个符号和最多ceil(log(2^64)/log(36))
个字符,即13个字符串。
例如
String s = Long.toString(x, 36);
long l = Long.parseLong(s, 36);