大厂学苑RPC框架核心源码深度解析
ZY复制下崽:https://www.zxit666.com/4272/
自研字符串紧缩算法
概述
不过,出于对流量的俭省和传输效率的提升,能够经过在堆栈上传前先紧缩一次数据来保证。下面给大家引见一种笔者本人探索的一种紧缩字符串的算法,并且自带加密效果。
算法引见
此算法运用场景:有限字符集的字符串紧缩。
例如Java办法全限定名的紧缩,关于办法全限定来说,组成成分:大小写英文字母,数字,特殊字符。在开发过程中,一个规范且合格的类名,办法名需求做到见名知意,依据有效统计,办法全限定99%以上由大小写英文字母组成。
public char[] build(String s) {
...
for (int i = 0; i < len; i++) {
c = s.charAt(i);
b = Character.isUpperCase(c);
if (b || c == FILL) {
if (i - lastIndex >= maxDistance) {
maxDistance = i - lastIndex;
}
upCharIndex.add(i - lastIndex);
lastIndex = i;
}
if (b) upCharCount++;
}
...
return handleHead(type);
}
复制代码
在紧缩前的第一步:在字符串开端时,保管并记载大写字母的位置和每一个大写字母之间的间隔。(小数点以为是一个大写字母)。
private char[] handleHead(int type) {
...
int k, j;
//记载大写字母位置与char中
for (int i = 0; i < chars.length; i++) {
if (i == 0) {
for (j = 0, k = 1; j < ch1; j++, k++) {
ch = bitToLeft(ch, upCharIndex.get(j), 12 - (k * stepDistance));
}
chars[i] = ch;
} else {
char emptyCh = FILL;
emptyCh &= 0;
int start = (i - 1) * sizeOfChar + ch1;
for (j = start, k = 1; j < start + sizeOfChar; j++, k++) {
if (j == upCharIndex.size())
break;
emptyCh = bitToLeft(emptyCh, upCharIndex.get(j), 16 - (k * stepDistance));
}
chars[i] = emptyCh;
}
}
return chars;
}
复制代码
Head的最小长度为:1个Char,也就是16bit。在16bit的高2位存储步长。接下来的2位记载真正的Head长度大小。