Skip to main content
一个用于对表数据进行混淆的简单工具。 它读取输入表并生成输出表;输出表会保留输入中的某些属性,但数据内容不同。 它可用于发布与真实生产数据非常接近的数据,以供基准测试使用。 它旨在保留数据的以下属性:
  • 每一列以及每个列 Tuple 的值基数 (不同值的数量) ;
  • 条件基数:在某一列取某个值的条件下,另一列的不同值数量;
  • 整数绝对值的概率分布;有符号整数的符号;浮点数的指数和符号;
  • 字符串长度的概率分布;
  • 数值为零、空字符串和空数组以及 NULL 值的概率;
  • 使用 LZ77 和 entropy 家族编解码器压缩时的数据压缩率;
  • 时间值在整张表中的连续性 (差值的量级) ;浮点值的连续性;
  • DateTime 值的日期部分;
  • 字符串值的 UTF-8 有效性;
  • 字符串值看起来自然。
上述大多数属性都适用于性能测试: 由于保留了基数、量级、压缩率等特征,读取数据、过滤、聚合和排序的速度 将与原始数据上的速度几乎相同。 它以确定性的方式运行:你定义一个 seed 值后,转换结果就由输入数据和 seed 共同决定。 某些转换是一一对应的,因此可以被逆向还原,所以你需要使用足够大的 seed,并对其保密。 它会使用一些密码学原语来转换数据,但从密码学角度看,这种做法并不规范,因此除非你有其他依据,否则不应将结果视为安全。结果中可能仍会保留一些你不希望发布的数据。 它始终会像源数据中那样,原样保留数字 0、1、-1、日期、数组长度以及 null 标志。 例如,如果你的表中有一列 IsMobile,其值为 0 和 1,那么在转换后的数据中,它仍会保持相同的值。 因此,用户将能够精确统计移动流量的占比。 再举一个例子。假设你的表中包含一些私密数据,例如用户邮箱,而你不想公开任何一个具体的邮箱地址。 如果你的表足够大,包含多个不同的邮箱,并且没有某个邮箱的出现频率明显高于其他邮箱,那么它可以将所有数据匿名化。但如果某一列中的不同值数量较少,它就可能复现其中的一部分值。 你应该了解这个工具的工作算法,并细致调整它的命令行参数。 这个工具只有在数据量至少达到中等规模时 (至少数千行) 才能良好工作。
最后修改于 2026年7月3日