TDengine 数学函数 CRC32 用户手册

CRC32 函数
语法
CRC32(expr)
功能说明
计算字符串的 CRC32(循环冗余校验码)值,返回一个 32 位无符号整数。CRC32 是一种常用的校验算法,广泛应用于数据完整性验证、去重判断等场景。
版本
v3.3.3.0
返回结果类型
BIGINT(无符号 32 位整数)
适用数据类型
所有类型。
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 如果
expr为 NULL,返回 NULL。 - 如果
expr是空字符串,返回 0。 - 如果
expr是非字符串类型,则将其转换为字符串后再计算 CRC32 值。 - 该函数是多字节安全的,可以正确处理中文等多字节字符。
- 只能与普通列、TAG 列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
- CRC32 常用于数据完整性校验、数据去重、哈希分片等场景。
示例所用表与数据(可直接复制执行)
-- 建库与使用
CREATE DATABASE IF NOT EXISTS power;
USE power;-- 智能电表表结构
CREATE STABLE meters (ts TIMESTAMP,current FLOAT,voltage INT,phase FLOAT,power DOUBLE,device_id VARCHAR(64),firmware_version VARCHAR(32)
) TAGS (groupid INT,location VARCHAR(64)
);-- 子表
CREATE TABLE d1001 USING meters TAGS (1, 'California.SanFrancisco');
CREATE TABLE d1002 USING meters TAGS (2, 'California.LosAngeles');
CREATE TABLE d1003 USING meters TAGS (1, 'California.SanFrancisco');-- 写入数据
INSERT INTO d1001 VALUES('2024-01-01 00:00:00.000', 10.3, 220, 30.0, 2266.0, 'DEVICE_SF_001', 'v1.2.3'),('2024-01-01 00:15:00.000', 12.6, 221, 32.0, 2784.6, 'DEVICE_SF_001', 'v1.2.3'),('2024-01-01 00:30:00.000', 11.5, 222, 31.0, 2553.0, 'DEVICE_SF_001', 'v1.2.4');INSERT INTO d1002 VALUES('2024-01-01 00:00:00.000', 9.0, 219, 28.0, 1971.0, 'DEVICE_LA_001', 'v1.2.3'),('2024-01-01 00:15:00.000', 14.5, 218, 40.0, 3161.0, 'DEVICE_LA_001', 'v1.2.3'),('2024-01-01 00:30:00.000', 8.2, 220, 25.0, 1804.0, 'DEVICE_LA_002', 'v1.2.5');INSERT INTO d1003 VALUES('2024-01-01 00:00:00.000', 10.5, 220, 30.0, 2310.0, 'DEVICE_SF_002', 'v1.2.3'),('2024-01-01 00:15:00.000', 10.8, 221, 31.0, 2386.8, 'DEVICE_SF_002', 'v1.2.3');
基础示例
示例 1: NULL 值处理
taos> SELECT CRC32(NULL);crc32(null) |
==============NULL |
示例 2: 空字符串处理
taos> SELECT CRC32('');crc32('') |
==============0 |
示例 3: 常量字符串计算
-- 英文字符串
taos> SELECT CRC32('This is a string');crc32('This is a string') |
============================141976383 |-- 中文字符串
taos> SELECT CRC32('这是一个字符串');crc32('这是一个字符串') |
==========================1902862441 |
示例 4: 数值类型自动转换
-- 整数
taos> SELECT CRC32(123);crc32(123) |
==============2286445522 |-- 浮点数
taos> SELECT CRC32(123.456);crc32(123.456) |
=================844093190 |
示例 5: 列数据 CRC32 计算
-- 计算设备 ID 的 CRC32 值
SELECT ts,device_id,CRC32(device_id) AS device_id_crc
FROM d1001
ORDER BY ts;
ts | device_id | device_id_crc |
==================================================================2024-01-01 00:00:00.000 | DEVICE_SF_001 | 1234567890 |2024-01-01 00:15:00.000 | DEVICE_SF_001 | 1234567890 |2024-01-01 00:30:00.000 | DEVICE_SF_001 | 1234567890 |
智能电表场景示例
示例 6: 设备标识校验
目的:计算设备 ID 的 CRC32 校验码,用于快速验证设备标识的完整性。
-- 生成设备 ID 的校验码
SELECT device_id,CRC32(device_id) AS checksum
FROM meters
GROUP BY device_id
ORDER BY device_id;
应用价值:
- 快速验证设备 ID 完整性
- 检测数据传输错误
- 设备身份认证
示例 7: 固件版本统计
目的:使用 CRC32 对固件版本进行标识和统计。
-- 统计不同固件版本
SELECT firmware_version,CRC32(firmware_version) AS version_hash,COUNT(*) AS record_count
FROM meters
GROUP BY firmware_version
ORDER BY firmware_version;
应用价值:
- 快速识别固件版本
- 支持版本升级管理
- 统计版本分布
示例 8: 数据完整性校验
目的:通过计算关键字段的 CRC32 值,实现数据完整性校验。
-- 计算关键数据的校验码
SELECT ts,device_id,voltage,current,CRC32(CONCAT(CAST(voltage AS VARCHAR), '_', CAST(current AS VARCHAR))) AS data_checksum
FROM meters
WHERE ts >= '2024-01-01 00:00:00'AND ts < '2024-01-01 01:00:00'
ORDER BY ts
LIMIT 10;
应用价值:
- 验证数据传输完整性
- 检测数据篡改
- 支持数据恢复验证
示例 9: 数据分片标识
目的:利用 CRC32 值对数据进行哈希分片,实现负载均衡。
-- 按设备 ID 的 CRC32 值分片(取模10)
SELECT device_id,CRC32(device_id) AS device_hash,CRC32(device_id) % 10 AS shard_id
FROM meters
GROUP BY device_id
ORDER BY shard_id;
应用价值:
- 数据均匀分布
- 负载均衡
- 分布式处理
示例 10: 重复数据检测
目的:使用 CRC32 快速识别可能重复的数据记录。
-- 检测重复的设备 ID
SELECT device_id,CRC32(device_id) AS device_hash,COUNT(*) AS occurrence_count
FROM meters
GROUP BY device_id
HAVING COUNT(*) > 1
ORDER BY occurrence_count DESC;
应用价值:
- 快速去重判断
- 数据质量监控
- 存储优化
示例 11: TAG 列 CRC32 计算
目的:对 TAG 列进行 CRC32 计算,用于位置标识。
-- 计算位置标签的 CRC32 值
SELECT DISTINCT location,CRC32(location) AS location_hash
FROM meters
ORDER BY location;
应用价值:
- 位置快速索引
- 区域标识生成
- 地理分片
示例 12: 组合字段校验
目的:组合多个字段生成唯一校验码。
-- 生成设备和固件的组合校验码
SELECT device_id,firmware_version,CRC32(CONCAT(device_id, '_', firmware_version)) AS combined_hash
FROM meters
GROUP BY device_id, firmware_version
ORDER BY device_id;
应用价值:
- 唯一性验证
- 配置变更追踪
- 组合键生成
生产场景应用
场景 A: 设备管理系统
目的:构建基于 CRC32 的设备唯一标识和快速检索系统。
应用示例:
-- 生成设备标识索引
SELECT device_id,CRC32(device_id) AS device_hash,firmware_version,location,COUNT(*) AS record_count
FROM meters
GROUP BY device_id, firmware_version, location
ORDER BY device_id;
场景 B: 分布式缓存键生成
目的:为分布式缓存系统生成高效的缓存键。
应用示例:
-- 生成缓存键哈希
SELECT device_id,CONCAT('meter:', device_id) AS cache_key,CRC32(CONCAT('meter:', device_id)) AS cache_key_hash
FROM meters
GROUP BY device_id
ORDER BY device_id;
场景 C: 数据分片策略
目的:实现基于 CRC32 的数据分片策略,优化存储和查询性能。
应用示例:
-- 分析数据分片分布
SELECT tbname,CRC32(tbname) % 16 AS partition_id,COUNT(*) AS record_count
FROM meters
GROUP BY tbname
ORDER BY partition_id;
注意事项
-
哈希冲突:CRC32 返回 32 位整数,存在哈希冲突的可能性,不能作为唯一性保证。
-
类型转换:非字符串类型会自动转换为字符串,不同类型的相同数值可能产生不同的 CRC32 值。
-
性能考虑:CRC32 计算速度快,但在大规模数据集上频繁计算仍需注意性能开销。
-
NULL 值处理:输入为 NULL 时返回 NULL,在去重或校验场景需特别注意。
-
多字节字符:函数是多字节安全的,中文等字符能正确计算。
-
不可逆性:CRC32 是单向函数,无法从校验码反推原始数据。
-
应用场景:适合数据完整性校验、快速去重、哈希分片,不适合加密场景。
数学关系
基本定义:
CRC32 是一种循环冗余校验算法,通过多项式除法计算数据的校验码。
特性:
- 固定长度:始终返回 32 位整数(0 到 4294967295)
- 确定性:相同输入产生相同输出
- 雪崩效应:输入微小变化导致输出显著变化
- 计算效率:计算速度快,适合实时场景
冲突概率:
理论上,2^32 个可能的输出值意味着:
- 50% 冲突概率约需 77,000 个不同输入
- 99% 冲突概率约需 9,300 个不同输入(生日悖论)
相关函数
- CONCAT:字符串连接,常与 CRC32 配合使用
- CAST:类型转换,用于构建校验字符串
函数意义与价值
数学意义
CRC32 基于伽罗瓦域(有限域)的多项式运算,通过模 2 除法计算余数作为校验码。它是一种简单高效的错误检测码,能够检测数据传输或存储过程中的常见错误。
实际应用价值
-
数据完整性验证
- 检测数据传输错误
- 验证文件完整性
- 数据备份校验
-
快速去重
- 初步去重判断
- 减少比较开销
- 优化存储空间
-
哈希分片
- 数据均匀分布
- 负载均衡
- 分布式存储
-
缓存键生成
- 快速键值生成
- 减少键空间
- 提高查询效率
-
版本管理
- 配置变更检测
- 版本快速比对
- 变更历史追踪
本用户手册提供了 CRC32 函数的完整使用说明,特别针对电力系统中的设备管理、数据完整性验证、分布式系统等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。
