ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

StarRocks md5sum_numeric 函数详解:多参数 128 位 MD5 校验和的数值化实现

StarRocks md5sum_numeric 函数详解:多参数 128 位 MD5 校验和的数值化实现 StarRocks md5sum_numeric 函数详解多参数 128 位 MD5 校验和的数值化实现【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksmd5sum_numeric是 StarRocks 内置的加密/摘要类函数用于对一个或多个 VARCHAR 字符串联合计算 128 位 MD5 校验和并将结果转换为LARGEINT 十进制数值返回。它适用于数据一致性校验、行级指纹生成、去重键构造等需要多字段联合摘要的实时分析场景。读完本文你将掌握该函数的语法、返回值语义、NULL 处理规则并了解其在 BE 端向量化实现 与 FE 端注册 中的底层原理。函数概述md5sum_numeric是 MD5 摘要函数家族中的数值化变体。它与十六进制字符串版的md5sum计算的是同一条 128 位校验和区别只在于输出形式md5sum返回 32 位十六进制字符串而md5sum_numeric将该 128 位摘要按十六进制解析为LARGEINT128 位有符号整数以十进制数字字符串呈现。其核心特点包括支持一个或多个VARCHAR 参数多参数按给定顺序联合计算校验和返回类型为LARGEINT可直接参与数值运算与比较参数中的NULL值会被跳过不参与摘要计算输入为空未提供任何参数时返回错误。语法与参数说明LARGEINT md5sum_numeric(VARCHAR expr,...);要素说明函数名md5sum_numeric参数expr待计算校验和的字符串必须为VARCHAR类型且支持以逗号分隔的多个参数变长参数返回值LARGEINT类型校验和若输入为空则返回错误在 FE 端函数名以常量MD5_SUM_NUMERIC定义并注册进内置函数集见 FunctionSet.java 与 注册处在 BE 端向量化函数入口通过宏在 encryption_functions.h 中声明DEFINE_VECTORIZED_FN(md5sum_numeric)。返回值语义LARGEINT 与 128 位摘要的关系理解该函数的关键在于返回值类型LARGEINT。StarRocks 的LARGEINT是128 位有符号整数取值范围约为[-2^127, 2^127 - 1]而 MD5 摘要本身是一个128 位无符号数值范围[0, 2^128 - 1]。BE 实现通过StringParser::string_to_intuint128_t(digest.hex().c_str(), digest.hex().size(), 16, parse_res)将 32 个十六进制字符的摘要按 base-16 直接解析为uint128_t并写入 LARGEINT 列见 encryption_functions.cpp。因此当摘要的最高位bit 127为0时返回值为正数与文档示例一致当摘要的最高位为1时解析为有符号 LARGEINT 后会得到负数。BE 单元测试中{dorisqq,1,324,2111}四个字符串联合校验的结果正是负数-26740813726225727664539830060158831113见 encryption_functions_test.cpp这是符合预期的正常现象而非错误。实践提示若业务侧需要与标准 MD5 十六进制字符串做对照如与其他系统互校验应优先使用返回字符串的md5summd5sum_numeric更适合直接在 SQL 层做数值比较、取模分桶或作为数值型指纹键。使用示例以下示例来自官方文档 md5sum_numeric.md可在 MySQL 客户端直接验证。1. 单个字符串mysql select md5sum_numeric(starrocks); ----------------------------------------- | md5sum_numeric(starrocks) | ----------------------------------------- | 328761383472799310362963866384446095221 | ----------------------------------------- 1 row in set (0.01 sec)2. 多个字符串联合校验mysql select md5sum_numeric(starrocks,star); ----------------------------------------- | md5sum_numeric(starrocks, star) | ----------------------------------------- | 163436627872604162110984707546327199448 | ----------------------------------------- 1 row in set (0.01 sec)注意多参数结果是按参数顺序联合计算出的单一校验和并非对各参数分别计算因此md5sum_numeric(starrocks,star)与md5sum_numeric(starrocksstar)或md5sum_numeric(star,starrocks)的结果都不相同参数顺序会影响摘要值。3. 含 NULL 参数mysql select md5sum_numeric(null); ----------------------------------------- | md5sum_numeric(NULL) | ----------------------------------------- | 281949768489412648962353822266799178366 | ----------------------------------------- 1 row in set (0.01 sec)可以看到传入NULL并不会导致函数报错而是将该参数跳过、对剩余输入此处为空内容计算校验和。源码级实现原理md5sum_numeric的完整计算链路位于 BE 端向量化函数EncryptionFunctions::md5sum_numericencryption_functions.cpp其处理流程如下参数视图构建将所有输入列逐一封装为ColumnViewerTYPE_VARCHAR形成参数视图列表逐行计算对每行数据创建Md5Digest摘要对象按参数顺序依次将各字符串update进摘要器NULL 跳过通过if (view.is_null(row)) continue;跳过 NULL 参数这正是示例 3 中 NULL 不报错、不影响联合摘要的原因摘要完成与转换调用digest.digest()得到 128 位摘要再将其十六进制文本用 base-16 解析为uint128_t追加进ColumnBuilderTYPE_LARGEINT结果列。Md5Digest是底层摘要封装类内部持有MD5_CTX状态并暴露update(data, length)、digest()与hex()三个接口定义于 be/src/base/crypto/md5.h。由于 MD5 支持增量更新多参数联合计算等价于将各参数按序拼接后一次性计算但内存上无需真正拼接大字符串实现更高效。与 md5sum、md5 的对比同一个源文件中还实现了相近的函数encryption_functions.cpp三者对比如下函数参数数量返回类型返回形式NULL 处理md5单个VARCHAR32 位十六进制字符串返回 NULLmd5sum多个VARCHAR32 位十六进制字符串联合摘要跳过 NULL 参数md5sum_numeric多个LARGEINT128 位摘要的十进制数值跳过 NULL 参数md5sum与md5sum_numeric的摘要计算逻辑完全一致相同的多参数联合、NULL 跳过流程唯一差异在于md5sum直接输出digest.hex()字符串而md5sum_numeric额外做了一次 hex → 数值转换。单元测试验证BE 端在 encryption_functions_test.cpp 中提供了两组针对性测试md5sum_numericTest构造 4 个普通字符串列dorisqq,1,324,2111作为参数断言输出 LARGEINT 列首元素等于预期值-26740813726225727664539830060158831113验证了多参数联合摘要与负数语义md5sum_numericNullTest在参数列表中追加 4 个全部为 NULL 的可空列结果与不含 NULL 的用例一致验证了NULL 参数被跳过、不影响摘要结果的行为。这两组测试可以直接在 BE 测试框架下运行作为函数行为回归的依据。使用注意事项参数类型所有参数必须为VARCHAR若需对其他字符串类型如 CHAR 列使用请先显式转换。空输入未提供任何参数时函数返回错误因此至少需要传入一个表达式。返回负数由于 LARGEINT 为 128 位有符号整数MD5 摘要最高位为 1 时结果可能为负数属于正常语义比较与排序时请按有符号数值理解。确定性同一组输入始终得到相同校验和适合作为稳定的数值指纹但需注意摘要碰撞风险与 MD5 本身的安全性定位——该函数面向校验与指纹场景不宜用作密码学安全的哈希。NULL 语义单个参数为 NULL 时跳过该参数继续计算结果仍为非 NULL这一行为与md5sum一致而与单参数md5(NULL)返回 NULL 的行为不同。综上md5sum_numeric通过多参数联合摘要 128 位数值化的设计把 MD5 校验能力以数值形式带入 SQL 计算层尤其适合在实时数仓中直接生成数值型行指纹或一致性校验键。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表