很久之前接触过一个灰盒的漏洞检测工具,当时跟工具的开发者讨论了一些工具未解决的一些痛点,op 印象比较深的是其中一个点,这个工具的漏洞检测算法会参考调用栈信息,因此存储了海量的stack trace
数据,因为一些业务上的因素,这些数据需要能够存储一段时间才能删除,比如存储够一个月,那这累积下来存储空间的占用就是一个比较头疼的问题,比如 Java 的调用栈可能的一个数据样例:
java.lang.RuntimeException: level 2 exception
at com.msh.demo.exceptionStack.Test.fun2(Test.java:17)
at com.msh.demo.exceptionStack.Test.main(Test.java:24)
at sun.reflect.NativeMethodAccessorIm 猴子 pl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.io.IOException: level 1 exception
at com.msh.demo.exceptionStack.Test.fun1(Test.java:10)
at com.msh.demo.exceptionStack.Test.fun2(Test.java:15)
... 6 more
笔者之前看过美剧《硅谷》之后就对压缩算法领域很是感兴趣,也研究过一些压缩算法的实现,之前自己也针对性的设计过几款压缩算法整体压缩率还是很高的,于是就想着看看能不能解决这个问题,开始思考如何针对此类数据的特性针对性设计压缩算法:
sun.reflect.DelegatingMethodAccessorImpl.invoke
,让我们来以代码静态分析的视角来看这个数据,我们把这个称之为符号symbol
,则让我们把这个符号按照包分隔符.
进行分割,并且从上往下对应到一颗树上,则我们可以把程序代码中的所有可能的符号都看做是一颗根节点为空字符的树上的不同的路径(因为程序代码量是有限的,所以这颗树的大小其实也是可控的,一般不会特别离谱,暂不考虑代码混淆的情况的话...),则我们的问题转换为如何存储这棵树以及每个路径对应的节点sun.reflect.DelegatingMethodAccessorImpl.invoke
压缩到一个 4 字节甚至更短的整数,比如把sun.reflect.DelegatingMethodAccessorImpl.invoke
对应到整数10086
以上仅为个人的头脑风暴,还未编码验证,发到 v2 里与老哥们讨论一下,欢迎老哥们发表看法互相讨论。
最后,贴上一个美剧《硅谷》中我比较喜欢的一帧截图:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.