MD5 计算字符串的 MD5 值
MD5(str) 返回 32 位十六进制字符串,输入为 NULL 时返回 NULL。七个引擎都同名支持,同一个字符串在各引擎算出的结果相同。差异在能否直接传数字、二进制,以及多列一起算时如何处理 NULL。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | MD5(str) | str 为 STRING。BIGINT、DOUBLE、DECIMAL 和 DATETIME 会隐式转换成 STRING,其他类型报错。输入为 NULL 时返回 NULL。 | 官方文档 |
| Hologres | 支持 | MD5(str) | 参数和返回值都是 TEXT,结果是十六进制形式。 | 官方文档 |
| StarRocks | 支持 | MD5(expr) | expr 为 VARCHAR,返回 32 位十六进制的 VARCHAR,输入为 NULL 时返回 NULL。对多个字符串一起算可以用 md5sum。 | 官方文档 |
| Doris | 支持 | MD5(input) | 接受字符串和二进制类型。文档示例中内容相同的 VARBINARY 和 VARCHAR 结果相同,NULL 返回 NULL。 | 官方文档已实测 4.1.5 |
| Hive | 支持 | md5(string/binary) | Hive 1.3.0 起提供,返回 32 位十六进制字符串,参数为 NULL 时返回 NULL。 | 官方文档已实测 4.2.1 |
| Spark SQL | 支持 | md5(expr) | Spark 1.5.0 起提供,返回十六进制字符串。 | 官方文档 |
| Flink SQL | 支持 | MD5(string) | 返回 32 位十六进制字符串,参数为 NULL 时返回 NULL。 | 官方文档已实测 2.3.0 |
迁移注意事项
- 对多列拼接后算 MD5 时,只要一列是 NULL,CONCAT 的结果就是 NULL,整行哈希也变成 NULL。拼接前要先用 COALESCE 把 NULL 换成固定值,并用分隔符隔开各列。
- 对数字或日期算 MD5 时,结果取决于它转成字符串后的样子。不同引擎对 DOUBLE、DECIMAL 和时间的默认格式不一样,跨引擎对数时先显式 CAST 或格式化成同一个字符串。
- MaxCompute 只接受 STRING 和几种可隐式转换的类型,传入其他类型会报错。Doris 和 Hive 可以直接对二进制类型算 MD5。
- MD5 适合做数据对比和生成哈希键,不适合存密码等安全场景。
示例
计算字符串的 MD5 值
SELECT MD5('abc'); -- 900150983cd24fb0d6963f7d28e17f72SELECT MD5('abc'); -- 900150983cd24fb0d6963f7d28e17f72SELECT MD5('abc'); -- 900150983cd24fb0d6963f7d28e17f72SELECT MD5('abc'); -- 900150983cd24fb0d6963f7d28e17f72SELECT md5('abc'); -- 900150983cd24fb0d6963f7d28e17f72SELECT md5('abc'); -- 900150983cd24fb0d6963f7d28e17f72SELECT MD5('abc'); -- 900150983cd24fb0d6963f7d28e17f72多列拼接后计算整行哈希,NULL 先替换成空字符串
SELECT id, MD5(CONCAT_WS('|', COALESCE(name, ''), COALESCE(phone, ''))) AS row_hash FROM users;SELECT id, MD5(CONCAT_WS('|', COALESCE(name, ''), COALESCE(phone, ''))) AS row_hash FROM users;SELECT id, MD5(CONCAT_WS('|', COALESCE(name, ''), COALESCE(phone, ''))) AS row_hash FROM users;SELECT id, MD5(CONCAT_WS('|', COALESCE(name, ''), COALESCE(phone, ''))) AS row_hash FROM users;SELECT id, md5(concat_ws('|', coalesce(name, ''), coalesce(phone, ''))) AS row_hash FROM users;SELECT id, md5(concat_ws('|', coalesce(name, ''), coalesce(phone, ''))) AS row_hash FROM users;SELECT id, MD5(CONCAT_WS('|', COALESCE(name, ''), COALESCE(phone, ''))) AS row_hash FROM users;