首页/数据/数仓建模速查/哈希代理键:无状态生成与并行优势
维度与事实设计149 条

哈希代理键:无状态生成与并行优势

用自然键哈希生成代理键:无状态、可并行、跨表一致;代价是键变长、理论碰撞风险,需要固定拼接规则。

数仓建模速查数据更新于 2026-10-13

哈希代理键是什么

哈希代理键是把自然键按固定规则拼接后做一次哈希运算,把结果直接当作维表主键。它不需要序列、不需要集中发号,任何节点都能独立算出同一个值:同一个客户在事实表、维表和别的域里算出的 sk 完全一致。这是它相对自增序列键的最大优势——加载可完全并行,历史重算也不会产生新键。

基本信息

常用算法md5 / sha1 / sha256 / xxhash64
生成方式无状态纯函数,同输入同输出
键类型字符串(md5/sha1)或 bigint(xxhash64)
适用平台Hive / Spark / Flink / PostgreSQL 均可
主要代价键变长、不可读、存在理论碰撞

典型使用场景

  • 事实表与维表在同一作业生成,不依赖维表先落库,可并行执行
  • 历史数据回滚重算:键由数据本身决定,重算结果与现状一致
  • 多源合并:把源系统标识拼进输入串,避免不同系统的编号互相撞键
  • 流批一体:流任务与批任务用同一个表达式,键天然对齐
  • 按自然键关联时省去一次维表查询

生成哈希键

生成哈希键
-- 拼接规则一旦定下就不能改:前缀、分隔符、去空格、大小写
SELECT md5(concat_ws('|', 'CUST', upper(trim(customer_id)))) AS customer_sk
FROM stg_customer;

-- xxhash64 输出 bigint,更短更快,碰撞概率仍可接受
SELECT xxhash64(concat_ws('|', 'CUST', trim(customer_id))) AS customer_sk
FROM stg_customer;

算法选择对照

算法输出特点适用
md532 位十六进制快、体积适中大多数维表
sha140 位十六进制抗碰撞强于 md5安全要求较高
xxhash64bigint存储省、速度快追求性能的宽维表
sha25664 位十六进制最保守极低碰撞要求
哈希键不可读、不可排序,不能当作对外单号展示;对外仍用业务编码。拼接规则要写进维度规范并在所有作业里复用,任何一处写法不同就会算出两个键。
哈希碰撞在中小数据量下几乎不会出现,但维表到数十亿行且用短哈希时风险上升。做法是加载后比对 count(*) 与 count(distinct sk),发现重复立即换算法重建,别等关联错乱才发现。

易错点

  • 拼接规则不统一:同一客户在两张表里算出两个 sk,关联不上;应把拼接表达式抽成公共宏或视图
  • 拼接时未去前后空格、未统一大小写:编码 001 与空格加 001 哈希不同,同一实体落成两条成员
  • 拿哈希键当对外编号:32 位字符串业务无法核对,审计对不上账
  • 把 sk 当有序键做增量水位:哈希值分布随机,按它排序毫无业务含义
  • 跨源合并未加源系统前缀:两个系统都从 1 编号,直接撞键后属性互相覆盖

数据来源与参考

  • 数据仓库工具箱:代理键生成;Spark SQL 函数参考
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌