> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ClickHouse Obfuscator 文档

# clickhouse-obfuscator

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

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

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

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

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

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

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

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

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

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

* `DateTime` 值的日期部分；

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

* 字符串值看起来自然。

上述大多数属性都适用于性能测试：

由于保留了基数、量级、压缩率等特征，读取数据、过滤、聚合和排序的速度
将与原始数据上的速度几乎相同。

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

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

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

因此，用户将能够精确统计移动流量的占比。

再举一个例子。假设你的表中包含一些私密数据，例如用户邮箱，而你不想公开任何一个具体的邮箱地址。
如果你的表足够大，包含多个不同的邮箱，并且没有某个邮箱的出现频率明显高于其他邮箱，那么它可以将所有数据匿名化。但如果某一列中的不同值数量较少，它就可能复现其中的一部分值。
你应该了解这个工具的工作算法，并细致调整它的命令行参数。

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