概述
在开发中,经常有上报线上堆栈来分析处理线上问题的场景,所以,对堆栈的压缩和加密也是必不可少的。加密:可以使用AES对称加密算法,压缩:可以在上传时利用protobuf天生的压缩性对字符串进行压缩。
不过,出于对流量的节省和传输效率的提升,可以通过在堆栈上传前先压缩一次数据来保证。下面给大家介绍一种笔者自己摸索的一种压缩字符串的算法,并且自带加密效果。
算法介绍
此算法使用场景:有限字符集的字符串压缩。
例如Java方法全限定名的压缩,对于方法全限定来说,组成成分:大小写英文字母,数字,特殊字符。在开发过程中,一个标准且合格的类名,方法名需要做到见名知意,根据有效统计,方法全限定99%以上由大小写英文字母组成。
算法实现
压缩原理简述
将char字符的空闲bit位来存储有效的数据。比如通过将 a ~ z 映射成 1 ~ 26 的数字,并将Char类型以5bit为一组分为高、中、低三组,分别来存储一个数字(这一个数字代表一个字符)
建立字符串头结构: Head
在Java代码编写过程中,一个全限定字符串中的大写字母占比相对较小,因此,通过使用前补充字符的方式来记录全限定字符串中的大写字母。一个字符串如果是有限且不可变的,那么所组成他们的字符之间的相对位置是确定的。实现算法如下:
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;
}