跳到主要内容
跳到主要内容

clickhouse-obfuscator

一个简单的表数据模糊工具。

它读取输入表并生成输出表,保持输入的一些属性,但包含不同的数据。 它允许发布几乎真实的生产数据,以用于基准测试。

它设计为保留以下数据属性:

  • 每列和每组列的值的基数(不同值的数量);

  • 条件基数:在另一个列的值条件下,一个列的不同值的数量;

  • 整数的绝对值的概率分布;有符号整数的符号;浮点数的指数和符号;

  • 字符串长度的概率分布;

  • 数字的零值概率;空字符串和数组,NULLs;

  • 使用 LZ77 和熵编码族压缩时的数据压缩比;

  • 表中时间值的连续性(差异幅度);浮点值的连续性;

  • DateTime 值的日期组件;

  • 字符串值的 UTF-8 有效性;

  • 字符串值看起来自然。

上述大多数属性对于性能测试是可行的:

读取数据、过滤、聚合和排序的速度几乎与原始数据相同,因为基数、幅度、压缩比等都得到了保留。

它以确定性方式工作:你定义一个种子值,转换由输入数据和值种子决定。 某些转换是一对一的,可以反向操作,因此你需要拥有一个较大的种子并将其保密。

它使用某些加密原语来转换数据,但从加密的角度来看,它没有正确执行,因此你不应将结果视为安全,除非你有其他理由。结果可能保留一些你不想发布的数据。

它始终将 0、1、-1 数字、日期、数组长度和空标志与源数据完全一样。 例如,你的数据表中有一列 IsMobile,值为 0 和 1。在转换后的数据中,它将保持相同的值。

因此,用户将能够准确计算出移动流量的比例。

再举一个例子。当你的数据表中有一些私人数据,比如用户电子邮件时,你不想发布任何单一的电子邮件地址。 如果你的表足够大且包含多个不同的电子邮件,并且没有任何电子邮件的频率远高于其他,则将对所有数据进行匿名化。但是如果你在一列中有少量不同值,可能会重现其中的一些。 你应该查看该工具的工作算法,并微调其命令行参数。

此工具只在数据量至少适度(至少数千行)时工作良好。