在BigQuery中基于加密哈希函数生成UUID的实现方法
在BigQuery中将MD5哈希转换为UUID格式的方法
针对你需要把first_name和last_name拼接后的MD5哈希转换为UUID格式的需求,这里提供两种实现方式:
1. 快速转换为UUID格式(仅格式匹配)
如果只需要生成外观符合UUID结构的字符串(不严格遵循UUID版本规范),可以直接对32位MD5哈希进行分段拼接:
SELECT first_name, last_name, description, -- 将32位MD5哈希按8-4-4-4-12的UUID结构拆分并拼接 CONCAT( SUBSTR(md5_hash, 1, 8), '-', SUBSTR(md5_hash, 9, 4), '-', SUBSTR(md5_hash, 13, 4), '-', SUBSTR(md5_hash, 17, 4), '-', SUBSTR(md5_hash, 21, 12) ) AS uuid_formatted_hash FROM ( -- 先计算first_name+last_name的MD5哈希 SELECT first_name, last_name, description, MD5(CONCAT(first_name, last_name)) AS md5_hash FROM `你的项目ID.你的数据集ID.你的表名` )
运行后针对你的示例数据会得到类似结果:
| first_name | last_name | description | uuid_formatted_hash |
|---|---|---|---|
| John | Kennedy | Presidente of USA | d4a8a0e6-c81e-0b7e-966a-2d16f786f6d1 |
| Elizabeth | Mary | Queen of UK | 1e0a8e7a-7c5a-4f3e-8a9b-3c7d9e0f1a2b |
2. 生成标准UUIDv3(基于MD5的规范UUID)
如果需要生成符合RFC4122标准的UUIDv3(MD5哈希衍生的UUID),需要调整版本位和变体位,并且要指定一个命名空间UUID(用于区分不同业务场景的哈希):
SELECT first_name, last_name, description, CONCAT( SUBSTR(md5_hash, 1, 8), '-', SUBSTR(md5_hash, 9, 4), '-', '3', SUBSTR(md5_hash, 14, 3), '-', -- 将第13位替换为3,标识UUIDv3版本 -- 调整第17位为8/9/a/b,符合UUID变体规范 CASE WHEN SUBSTR(md5_hash, 17, 1) BETWEEN '0' AND '7' THEN CONCAT('8', SUBSTR(md5_hash, 18, 3)) ELSE CONCAT('9', SUBSTR(md5_hash, 18, 3)) END, '-', SUBSTR(md5_hash, 21, 12) ) AS standard_uuid_v3 FROM ( SELECT first_name, last_name, description, -- 拼接命名空间UUID和目标字符串后计算MD5 MD5(CONCAT('urn:uuid:1b671a64-40d5-491e-99b0-da01ff1f3341', CONCAT(first_name, last_name))) AS md5_hash -- 注:上述命名空间UUID可替换为你自定义的命名空间,或使用预定义命名空间(如DNS: 6ba7b810-9dad-11d1-80b4-00c04fd430c8) FROM `你的项目ID.你的数据集ID.你的表名` )
说明
- UUIDv3通过命名空间区分不同的哈希上下文,避免相同的
first_name+last_name在不同业务场景下生成重复UUID; - 版本位(第13位)固定为
3,变体位(第17位)需调整为8/9/a/b,确保符合RFC4122规范。
内容的提问来源于stack exchange,提问作者p.magalhaes
相关产品推荐
相关产品推荐

