> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ClickHouse Obfuscator 文档

# clickhouse-obfuscator

一个用于表数据混淆的简单工具。

它读取输入表并生成输出表，后者会保留输入中的某些属性，但数据内容不同。
它可用于发布与真实生产数据非常接近的数据，以便进行基准测试。

它旨在保留数据的以下属性：

* 每一列以及每组列 Tuple 的值基数 (不同值的数量) ；

* 条件基数：在另一列取某个值的条件下，一列中不同值的数量；

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

* 字符串长度的概率分布；

* 数值为零、空字符串、空数组和 `NULL` 的概率；

* 使用 LZ77 和 entropy 家族编解码器压缩时的数据压缩率；

* 时间值在整张表中的连续性 (差值的量级) ；浮点值的连续性；

* `DateTime` 值中的日期 component；

* 字符串值的 UTF-8 有效性；

* 字符串值看起来自然。

上述大多数属性对于性能测试都很重要：

由于保留了基数、量级、压缩率等属性，读取数据、筛选、聚合和排序的速度
将与原始数据几乎相同。

它以确定性的方式工作：你定义一个 seed 值，转换结果由输入数据和 seed 决定。
某些转换是一一对应的，并且可以逆向还原，因此你需要使用足够大的 seed，并将其保密。

它会使用一些密码学基本类型来转换数据，但从密码学角度看，这种做法并不严谨，因此除非你有其他理由，否则不应将结果视为安全。结果中仍可能保留一些你不希望发布的数据。

它始终会让源数据中的 0、1、-1、日期、数组长度以及 null 标志保持完全不变。
例如，如果你的表中有一列 `IsMobile`，其值为 0 和 1，那么在转换后的数据中，这一列仍会保持相同的值。

因此，用户将能够精确计算移动流量的实际 ratio。

再举一个例子。如果你的表中包含一些私网数据，例如用户邮箱，而你不想公开任何一个具体的邮箱地址，
那么当你的表足够大、包含多个不同邮箱，并且不存在某个邮箱的出现频率远高于其他邮箱时，它会将所有数据匿名化。但如果某一列中的不同值数量较少，它也可能复现其中的一些值。
你应该了解这个工具的工作算法，并微调其命令行参数。

这个工具只有在数据量至少达到中等规模时 (至少数千行) 才能良好工作。
