下载:咕炮云P6:Java互联网高级架构师第四期(SVIP加薪班)ZY复制崽:https://www.zxit666.com/4278/自研字符串压缩算法概述在开发过程中,经常会遇到上报线上仓库的场景,用于分析处理线上问题。因此,仓库的压缩和加密也是必不可少的。加密:可采用AES对称加密算法。压缩:protobuf产生的压缩可以用来压缩上传时的字符串。但是为了节省流量,提高传输效率,可以通过将数据压缩一次再上传入栈来保证。给大家介绍一个作者自己摸索出来的压缩字符串的算法,它自带加密功能。算法介绍该算法的应用场景:有限字符集的字符串压缩。比如Java方法全限定名的压缩,对于方法全限定名,组成:大小写英文字母,数字,特殊字符。在开发过程中,需要从名字上熟悉一个规范的、合格的类名和方法名。据有效统计,所有方法中99%以上必须由大小写英文字母组成。算法完全压缩原理简述利用char字符的空闲位来存储有效数据。比如将a~z映射成1到26的数字,将Char类型分成高、中、低三组,每组5位,每组存储一个数字(这个数字代表一个字符),创建一个stringheader结构:在Head的Java代码编写过程中,大写字母在全限定字符串中所占的比例比较小。因此,完全限定字符串中的大写字母在使用前通过补充字符记录。如果字符串是有限且不可变的,那么组成它们的字符之间的相对位置是确定的。补全算法如下:publicchar[]build(Strings){...for(inti=0;i=maxDistance){maxDistance=i-lastIndex;}upCharIndex.add(i-lastIndex);最后索引=我;}if(b)upCharCount++;}..returnhandleHead(type);}复制代码压缩前的第一步:在字符串的开头,保存并记录大写字母的位置和每个大写字母之间的距离。(小数点被认为是大写字母)。privatechar[]handleHead(inttype){...intk,j;//记录大写字母位置和charfor(inti=0;i0;f--)sBuilder.append(FILL);s=sBuilder.toString();}returns.toLowerCase();}重复代码拆分交换:填充后,将原字符串拆分为一组,三组分成多组。对于字符串中的数字或者特殊字符,我们没有在映射文件中形成映射,所以一旦出现,就会被“MASK”代替。publicshortbuildShort(charhigh,charmid,charlow){shortb=0;b|=getShortFromMapping(high)<<10;b|=getShortFromMapping(mid)<<5;b|=getShortFromMapping(low);返回b;}publicshortgetShortFromMapping(charch){if(mapping.containsKey(ch))returnmapping.get(ch);returnmapping.get(MASK);}复制代码创建完成压缩字符串Head+content=compressed完成细绳。综上所述,在算法构思初期,理论上压缩效率可以达到66%:一个char存三个char,但从最终包大小的总压缩率计算,压缩率应该只有50左右%。出现这种情况的原因是:字符串的长度并不总是3的整数倍,有多余的字符填充。压缩字符不是正确的ASCII码。在Java底层对字符集的编码和解码过程中,把它想象成汉字,一次一个字符就会被解码成两个大小的字符。