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