大厂学苑RPC框架核心源码深度解析

178 阅读1分钟

大厂学苑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长度大小。