opendsr-std/seedfaker
GitHub: opendsr-std/seedfaker
基于 Rust 的确定性合成数据生成器,跨七种运行时输出字节级一致的测试数据,支持多表外键关联、TB 级分布式分片生成和原地匿名化替换。
Stars: 23 | Forks: 0
# seedfaker
确定性合成数据生成器。相同的 seed,相同的输出 —— 跨越 CLI、Python、Node.js、Go、PHP、Ruby、WASM。
200+ 字段,68 种语言环境,多表 FK,表达式,模板,流式处理,用于匿名化现有数据的 `replace`。
## 核心亮点
- **跨 7 个运行时保持确定性** — CLI、Python、Node、Go、PHP、Ruby、WASM。相同的 seed → 字节完全一致。`--fingerprint` 可捕捉算法漂移。[→](#determinism)
- **多表 FK** — 锚点 (`users.id:zipf`),解引用 (`customer_id->email`),自引用,`ctx:strict` 身份关联。[→](docs/multi-table.md)
- **分布式** — 在三台主机上执行 `--shard I/N`,拼接后的结果与单机生成在比特级别完全一致。无需协调器。[→](#distributed-generation)
- **数据库摄入** — `seedfaker | psql "\COPY"`,无需生成临时文件,内存占用恒定。[→](guides/seed-database.md)
- **TB 级规模** — 在 8 核心上仅需 9 秒即可向 Postgres 导入 1 GB 数据([基准测试](benchmarks/payments_5gb.sh));1 TB 大约只需 4.3 小时。[→](guides/seed-large-database.md)
- **吞吐量** — 每核心约 90 MB/s(与 TPC-H dbgen 持平),8 线程下达 403 MB/s。可在 [`benchmarks/`](benchmarks/) 中复现。
- **原地匿名化** — `seedfaker replace email ssn < dump.csv`。相同的值 + 相同的 seed = 相同的替换结果;跨文件 join 依然有效。[→](docs/replace.md)
- **ML/LLM 数据集** — `--annotated`(字节偏移范围),`--corrupt`(15 种噪音类型),模板(prompt/completion),多表 FK(对话,RAG)。[→](guides/training-data.md)
- **语言环境感知的 PII** — Luhn 信用卡,IBAN 校验位,48 种政府 ID 格式,68 种语言环境,原生文字。[→](docs/fields.md)
## 目录
- [安装](#install)
- [库](#library)
- [CLI](#cli)
- [多表与 FK](#multi-table-and-fk)
- [分布式生成](#distributed-generation)
- [批量导入数据库](#bulk-load-into-a-database)
- [匿名化现有数据](#anonymise-existing-data)
- [用于 ML 的标注输出](#annotated-output-for-ml)
- [确定性](#determinism)
- [包与绑定](#packages-and-bindings)
- [文档](#documentation)
- [快速开始](#quick-start)
- [指南](#guides)
- [基准测试](#benchmarks)
- [许可证](#license)
## 安装
任选其一:
```
pip install seedfaker # Python
npm install @opendsr/seedfaker # Node.js
go get github.com/opendsr-std/seedfaker-go # Go
composer require opendsr/seedfaker # PHP
gem install seedfaker # Ruby
npm install @opendsr/seedfaker-wasm # Browser (WASM)
brew install opendsr-std/tap/seedfaker # CLI (macOS / Linux)
cargo install seedfaker # CLI (from source)
npm install -g @opendsr/seedfaker-cli # CLI (npm)
```
所有包都封装了相同的 Rust 核心,对于给定的 seed 会产生字节完全一致的输出。各包专属文档请参见 [包与绑定](#packages-and-bindings)。
## 库
生成单个值:
```
from seedfaker import SeedFaker
sf = SeedFaker(seed="test")
sf.field("email") # "janet.marsh@inbox.com"
sf.field("phone", e164=True) # "+14155551234"
sf.field("credit-card", space=True) # "4174 0785 8323 6433"
```
生成单条记录,使用 `ctx="strict"` 将每个字段锁定到一个身份:
```
sf.record(["name", "email", "phone"], ctx="strict")
# {"name": "Janet Marsh", "email": "janet.marsh@inbox.com", "phone": "+1 (957) 226-4272"}
```
批量生成:
```
sf.records(["name", "email", "phone"], n=1000, ctx="strict")
```
语言环境,加权混合,原生文字:
```
SeedFaker(seed="test", locale="de").field("name") # "Baldur Adler"
SeedFaker(seed="test", locale="ja").field("name") # "石本 和彦"
SeedFaker(seed="test", locale="en=7,de=2,fr=1") # weighted
```
Node.js API 完全相同:
```
const sf = new SeedFaker({ seed: "test", locale: "en" });
sf.records(["name", "email"], { n: 1000, ctx: "strict" });
```
完整 API:[docs/library](docs/library.md)。语言环境列表:[docs/context](docs/context.md)。
## CLI
```
seedfaker name email phone --seed test --until 2025 -n 1000
seedfaker name email phone --format csv --seed test --until 2025 -n 1000
seedfaker name email phone --format jsonl --seed test --until 2025 -n 1000
seedfaker name email --ctx strict -l ja,zh --abc native -n 10
```
通过管道直接导入数据库:
```
seedfaker name email phone --format sql=users -n 1000000 --seed staging --until 2025 | psql mydb
```
列间算术运算:
```
seedfaker price=amount:1..500:plain qty=integer:1..20 "total=price*qty" \
--format csv --seed ci -n 3 --until 2025
# price,qty,total
# 424.49,14,5942.86
# 459.67,3,1379.01
# 309.44,12,3713.28
```
常见日志/数据格式的预设:
```
seedfaker run nginx --rate 5000 --seed demo -n 0 > access.log
seedfaker run payment --format jsonl --seed bench -n 1000 --until 2025
```
全部标志:[docs/cli](docs/cli.md)。字段语法:[docs/fields](docs/fields.md)。配置:[docs/configs](docs/configs.md)。预设:[docs/presets](docs/presets.md)。
## 多表与 FK
```
# shop.yaml
users:
columns:
id: serial
name: first-name
email: email
options: { count: 1000, ctx: strict }
orders:
columns:
id: serial
customer_id: users.id:zipf
customer_name: customer_id->name
customer_email: customer_id->email
total: amount:usd:1..5000
options: { count: 50000 }
```
```
seedfaker run shop.yaml --all --output-dir ./data --format csv
```
- `users.id:zipf` — 具有幂律分布的 FK 锚点。使用 `:zipf=N` 可调整指数;省略则为均匀分布。
- `customer_id->email` — FK 解引用;解析为与 `customer_id` 选中的同一父行记录的 email。
- 支持自引用 FK(`employees.manager_id: employees.id`)。
详细信息:[docs/multi-table](docs/multi-table.md),[docs/expressions](docs/expressions.md)。
有关 GB/TB 规模的真实数据库批量加载,请参见 [guides/seed-large-database](guides/seed-large-database.md)。
## 分布式生成
确定性使得无协调器的水平扩展成为可能。`--shard I/N` 会输出完整 `serial` 范围中一个互不重叠且连续的切片;在不同主机上使用相同的 seed 会生成互不重叠的输出。将所有 N 个分片拼接起来(保留第一个分片的 header,其余的使用 `--no-header`)所产生的数据,在比特级别上与 `N=1` 的单机运行完全一致。
三台主机,一个数据集:
```
# host-a
seedfaker run shop.yaml --table events --seed prod -n 1_000_000_000 \
--shard 0/3 --format csv > events.part0.csv
# host-b
seedfaker run shop.yaml --table events --seed prod -n 1_000_000_000 \
--shard 1/3 --format csv --no-header > events.part1.csv
# host-c
seedfaker run shop.yaml --table events --seed prod -n 1_000_000_000 \
--shard 2/3 --format csv --no-header > events.part2.csv
```
收集并拼接:
```
cat events.part0.csv events.part1.csv events.part2.csv > events.csv
# 相同的字节,与以下具有相同的 SHA-256:
seedfaker run shop.yaml --table events --seed prod -n 1_000_000_000 --format csv
```
主机之间没有共享状态。无需协调器。无需后期处理合并步骤。每台主机都在各自的切片上受限于 CPU 算力并独立完成计算。
单机生成还可以在 `--shard` 的基础上叠加使用 `--threads N`,结合进程级和进程内并行:
```
seedfaker ... --shard 0/3 --threads 8 --format csv > events.part0.csv
```
关于如何选择这些机制以及它们如何协同工作的详细信息:[docs/cli § Sharding and threads](docs/cli.md#sharding-and-threads),[guides/seed-large-database](guides/seed-large-database.md)。
## 批量导入数据库
将生成的 CSV 直接通过管道导入 `COPY FROM STDIN` —— 无需中间文件,内存占用恒定:
```
seedfaker run shop.yaml --table users --format csv \
| psql "$PGURL" -q -c "\COPY users (id,name,email) FROM STDIN WITH (FORMAT csv, HEADER true)"
```
对于 GB/TB 级别的大规模加载:在第一阶段去除所有约束,加载完成后再将其添加回来。
```
CREATE UNLOGGED TABLE users (id UUID NOT NULL, name TEXT, email TEXT);
-- load rows with COPY FROM STDIN (no PK, no FK, no indexes)
ALTER TABLE users SET LOGGED;
ALTER TABLE users ADD PRIMARY KEY (id);
```
原因:在 INSERT/COPY 期间,Postgres 的约束和索引维护是按行进行的;推迟到加载后的单次扫描处理会显著加快速度。seedfaker 在结构设计上保证了 id 的唯一性,因此第一阶段的验证是无用功。
`--shard I/N` 将一张表的生成拆分为 N 个不重叠的 serial 范围。并行运行多个 `seedfaker | psql` 管道到同一张表中 —— Postgres 对每个后端进程持有 RowExclusive 锁,而不是 Exclusive 锁,因此支持对同一张表执行并发的 `COPY`。
```
# 4 个分片进入同一个表,并发
for i in 0 1 2 3; do
seedfaker run shop.yaml --table events --format csv --shard $i/4 \
| psql "$PGURL" -q -c "\COPY events (id,ts,user_id) FROM STDIN WITH (FORMAT csv, HEADER true)" &
done
wait
```
参考基准测试 [`benchmarks/payments_5gb.sh`](benchmarks/payments_5gb.sh) 端到端地实现了此模式:10 张表的支付数据集,带有调优配置的 Docker Postgres 17,按表划分的分片池,Postgres 侧的 WAL / checkpoint / cache-hit 计数器。
```
./benchmarks/payments_5gb.sh # ~100 MB, default
./benchmarks/payments_5gb.sh --scale 50 --shards 3 # ~5 GB with 3-way sharding of the big tables
./benchmarks/payments_5gb.sh --cleanup
```
完整的工作流程、调优原理、逐项参数成本表、跨引擎注意事项 (MySQL, ClickHouse, SQLite):[guides/seed-large-database](guides/seed-large-database.md)。
## 匿名化现有数据
替换现有 CSV 或 JSONL 中的特定列,保持其他列不变并保留跨文件的引用完整性:
```
$ echo 'name,email,ssn
Alice,alice@corp.com,123-45-6789' | seedfaker replace email ssn --seed anon
name,email,ssn
Alice,nolan.moreno.xxy@icloud.com,404-16-7659
```
相同的值 + 相同的 seed 在每次运行时都会产生相同的替换结果,因此(在分别掩码处理后)对 `users.email` 和 `events.email` 进行 join 操作仍然能够匹配。详细信息:[docs/replace](docs/replace.md)。
## 用于 ML 的标注输出
`--annotated` 会输出带有字节偏移范围的 JSONL,适用于 NER / PII 训练集:
```
$ seedfaker name email ssn --annotated --seed demo -n 1 --until 2025
{"text":"Paulina Laca\tim.ivana@eunet.rs\t9580255797203","spans":[{"s":0,"e":12,"f":"name","v":"Paulina Laca"},{"s":13,"e":30,"f":"email","v":"im.ivana@eunet.rs"},{"s":31,"e":44,"f":"ssn","v":"9580255797203"}]}
```
结合 `--corrupt low|mid|high|extreme` 可生成带噪音的训练数据。详细信息:[docs/annotated](docs/annotated.md),[docs/corruption](docs/corruption.md)。
## 确定性
每个值均派生自 `(seed, record_number, field_name)`。这意味着:
- 添加字段不会改变现有字段的值。
- 在配置中重新排列字段顺序不会改变其值。
- 在算法指纹相同的前提下,使用相同的 seed 可以在不同语言和版本间产生字节完全一致的输出。
在 CI 中固定指纹以检测算法变更:
```
seedfaker --fingerprint
# sf0-158dc9f79ce46b43
```
详细信息:[docs/determinism](docs/determinism.md),[docs/context](docs/context.md)(身份关联)。
## 包与绑定
| 语言 / 运行时 | 安装命令 |.Registry | 本地文档 |
| ------------------ | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------- |
| Python | `pip install seedfaker` | [pypi.org/project/seedfaker](https://pypi.org/project/seedfaker/) | [packages/pip](packages/pip/) |
| Node.js | `npm install @opendsr/seedfaker` | [npmjs.com/package/@opendsr/seedfaker](https://www.npmjs.com/package/@opendsr/seedfaker) | [packages/npm](packages/npm/) |
| Go | `go get github.com/opendsr-std/seedfaker-go` | [pkg.go.dev/github.com/opendsr-std/seedfaker-go](https://pkg.go.dev/github.com/opendsr-std/seedfaker-go) | [packages/go](packages/go/) |
| PHP | `composer require opendsr/seedfaker` | [packagist.org/packages/opendsr/seedfaker](https://packagist.org/packages/opendsr/seedfaker) | [packages/php](packages/php/) |
| Ruby | `gem install seedfaker` | [rubygems.org/gems/seedfaker](https://rubygems.org/gems/seedfaker) | [packages/ruby](packages/ruby/) |
| Browser (WASM) | `npm install @opendsr/seedfaker-wasm` | [npmjs.com/package/@opendsr/seedfaker-wasm](https://www.npmjs.com/package/@opendsr/seedfaker-wasm) | [packages/wasm](packages/wasm/) |
| CLI (npm) | `npm install -g @opendsr/seedfaker-cli` | [npmjs.com/package/@opendsr/seedfaker-cli](https://www.npmjs.com/package/@opendsr/seedfaker-cli) | [packages/npm-cli](packages/npm-cli/) |
| CLI (Homebrew) | `brew install opendsr-std/tap/seedfaker` | [github.com/opendsr-std/homebrew-tap](https://github.com/opendsr-std/homebrew-tap) | [docs/cli](docs/cli.md) |
| CLI (Cargo) | `cargo install seedfaker` | [crates.io/crates/seedfaker](https://crates.io/crates/seedfaker) | [docs/cli](docs/cli.md) |
所有包都封装了相同的 Rust 核心。除了各语言的原生命名习惯外,API 表面在不同语言中保持了高度一致。
## 文档
参考文档:[docs/](docs/)。
| | |
| ---------------- | --------------------------------------------------------------------------------------------------------- |
| **从这里开始** | [快速开始](docs/quick-start.md) |
| **CLI** | [命令与标志](docs/cli.md) · [确定性](docs/determinism.md) |
| **字段** | [语法与修饰符](docs/fields.md) · [字段参考 (200+)](docs/field-reference.md) |
| **配置** | [YAML 配置](docs/configs.md) · [多表](docs/multi-table.md) · [表达式](docs/expressions.md) |
| **输出** | [模板](docs/templates.md) · [标注](docs/annotated.md) · [流式处理](docs/streaming.md) |
| **数据质量** | [上下文](docs/context.md) · [数据损坏模拟](docs/corruption.md) · [替换](docs/replace.md) |
| **预设** | [内置预设](docs/presets.md) (nginx, payment, auth, postgres, syslog, medical, …) |
| **集成** | [库 API](docs/library.md) · [MCP](docs/mcp.md) |
工作流:[guides/](guides/)。可运行示例:[examples/](examples/)。
## 快速开始
```
pip install seedfaker
python -c 'from seedfaker import SeedFaker; print(SeedFaker(seed="demo").record(["name","email"]))'
```
或使用 CLI:
```
brew install opendsr-std/tap/seedfaker
seedfaker name email phone --seed demo --until 2025 -n 5
```
接下来:[docs/quick-start](docs/quick-start.md) 提供 10 分钟的演练,[docs/cli](docs/cli.md) 提供标志说明,[docs/fields](docs/fields.md) 提供字段语法定义。
## 指南
位于 [guides/](guides/) 的端到端工作流:
| | |
|----------- | ------------------------------------------------------------------------ |
| [填充数据库](guides/seed-database.md) | 带有跨表 FK 的 Postgres/MySQL 模拟数据库 |
| [填充大型数据库](guides/seed-large-database.md) | GB/TB 级批量加载 —— 并行 COPY,UNLOGGED,性能调优 |
| [分布式生成](guides/distributed-generation.md) | 无需协调器的多主机分片生成 |
| [匿名化生产数据](guides/anonymize-data.md) | 针对 CSV/JSONL 的 `replace`,保持跨文件的 FK 完整性 |
| [训练与评估数据集](guides/training-data.md) | NER/PII,LLM 微调,带有 ground truth 的评估,红蓝对抗,多语言 |
| [可复现的数据集](guides/reproducible-datasets.md) | 确定性测试固件,CI,指纹防护 |
| [库用法](guides/library-usage.md) | Python / Node.js SDK 模式 |
| [模拟 API 服务器](guides/mock-api-server.md) | Express / FastAPI 模拟 endpoint |
| [API 负载测试](guides/api-load-testing.md) | 限速流式处理,数据损坏 |
| [面向 AI 代理的 MCP](guides/mcp-ai-agents.md) | Claude / Cursor / VS Code 集成 |
## 基准测试
可复现的吞吐量测量、安装脚本、按字段细分的性能分析,以及端到端的 Postgres 加载基准测试 (`payments_5gb.sh`):[benchmarks/](benchmarks/)。
## 许可证
MIT
标签:GNU通用公共许可证, Go语言, LLM训练数据, MCP, MITM代理, Node.js, OpenVAS, PHP, PII生成, Python, Ruby, Rust, TB级数据处理, TPC-H, WebAssembly, 个人隐私信息, 伪随机, 全量替换, 分布式生成, 可视化界面, 合成数据, 外键, 多表关联, 多语言支持, 威胁情报, 安全测试框架, 开发者工具, 数据匿名化, 数据库测试, 数据掩码, 数据流水线, 数据清洗, 数据脱敏, 文档结构分析, 无后门, 日志审计, 本地化, 机器学习数据集, 流处理, 测试数据生成, 知识库, 确定性生成, 程序破解, 网络流量审计, 逆向工具, 通知系统