SLS数据加工实现Hashids库对数据进行编码

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Hashids是一个非常小巧的跨语言的开源库,它可以将数字编码成一个简短、唯一、非顺序的ID。

阿里云日志服务介绍

日志服务(Log Service,简称SLS)是云原生观测与分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。日志服务一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,全面提升您在研发、运维、运营、安全等场景的数字化能力。

数据加工服务是阿里云SLS推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景。

Hashids是什么

背景

Hashids是一个非常小巧的跨语言的开源库,它可以将数字编码成一个简短、唯一、非顺序的ID。比如347这样的数字转换为“yr8”这样的字符串,或将[27986]这样的数字数组转换为“3kTMd”。拿论坛来说,一般帖子在数据库里的id都是顺序递增的,但是你可能不想在url上直接把id暴露出来,以免爬虫直接遍历id爬取你的内容,给你带来损失。那现在你就可以使用Hashids把这个id打乱,让它失去顺序性,无法直接遍历,这样就可以直接提高了爬虫的门槛。

特点

Hashids是一个将数字转化为长度较短、唯一且不连续的值的库。特点是:

  • 对非负整数都可以生成唯一短id
  • 可以设置不同的盐,具有保密性
  • 递增的输入产生的输出无法预测
  • 代码较短,且不依赖于第三方库

Hashids不同于md5这种算法这种单向映射,Hashids除了编码还会解码。hashids不仅可以编码一个整数,还可以一次编码多个整数,这对于将多个参数捆绑到一个参数中或简单地将它们用作短UID很有用。解码的时候不需要对字符串进行分割,可以直接解码成多个整数。(如下文示例二场景)这在存储一个数据时给我们多了一种选择,一般我们使用json打包多个id放在数据表的一个字段里,现在我们就可以使用hashids把它们编码成一个字符串塞进去了,可以节省一定的存储空间。

场景应用

比如在博文《Generating YouTube-like IDs in Postgres using PL/V8 and Hashids》所讨论的场景里,想在 RESTful 路由中公开一个资源,但是不希望 URL 容易被猜到。换句话说,我们的标准是将诸如 https://example.com/products/1https://example.com/products/2https://example.com/products 之类的 URL /3显示出来,这是很容易猜到的,因为我们将数据库的自动递增整数主键公开为资源 ID。为了防止人们编写一个超级简单的脚本来抓取我的整个产品目录,如果我们可以使 URL 不易被猜测,同时仍然对认识它们的人保持公开访问,那就太好了。

一个简单的方案是直接使用UUID,但是像 https://example.com/products/3bc95fb9-f0c1-4af8-989e-6ea8467879d3 这样的 URL 看起来很繁琐,特别是当你使用它们的嵌套子资源时附上自己的 UUID。这时候就会想到名为 Hashids 的库,它可以接受一个整数输入(例如我们的主键)和一个盐,并将它们混淆成类似 YouTube 的、简短的、不可猜测的 ID,如下所示:https://example .com/products/NVhttps://example.com/products/6mhttps://example.com/products/yD

下文具体来介绍SLS中是如何使用Hashids库对数据进行编码(hashids_encoding)和解码(hashids_decoding)。

SLS数据加工Hashids函数使用

hashids_encoding

使用Hashids库对数据进行编码

函数格式

hashids_encoding(value, salt="", min_length=0)

参数说明

参数名称

参数类型

是否必填

说明

value

Number、

List、

Tuple

被编码的数据,当value为数字时,不能小于0。

salt

String

加密数据使用的盐值,默认是空字符串。

min_length

Number

生成的哈希的最小长度,默认是0。

返回结果

返回加密后的字符串

hashids_decoding

对已有的Hashids库编码后的数据进行解码

函数格式

hashids_decoding(hashid, salt="", min_length=0)

参数说明

参数名称

参数类型

是否必填

说明

hashid

String

需要被解码的数据。

salt

String

解密数据使用的盐值,默认是空字符串。

min_length

Number

生成的哈希的最小长度,默认是0。

返回结果

返回解密后的数据

应用场景一

场景一:对一个整数进行编解码,默认盐值和哈希长度。

原始日志:

content:test

加工规则:

e_set("hashid", hashids_encoding(123))

e_set("value", hashids_decoding(v("hashid")))


加工结果:

content:test

hashid:Mj3

value:[123]

场景二:对多个整数(List类型)进行编解码,默认哈希长度,自定义盐值。

原始日志:

content:test

加工规则:

e_set("hashid", hashids_encoding([123, 456], salt="test"))

e_set("value", hashids_decoding(v("hashid"), salt="test"))

加工结果:

content:test

hashid:bpBHYO

value:[123, 456]

场景三:对多个整数(List类型)进行编码,自定义盐值和哈希长度。

原始日志:

content:test

加工规则:

e_set("hashid", hashids_encoding([123, 456,789,100], salt="test", min_length=32))

e_set("value", hashids_decoding(v("hashid"), salt="test", min_length=32))

加工结果:

content:test

hashid:xvrp2G1DnaQObsRoSEQI65zmYZP043Aj

value:[123, 456, 789, 100]

场景四:对多个整数(Tuple类型)进行编码,自定义盐值和哈希长度。

原始日志:

content:test

加工规则:

e_set("hashid", hashids_encoding((123, 456, 100, 200, 300), salt="test", min_length=32))

e_set("value", hashids_decoding(v("hashid"), salt="test", min_length=32))

加工结果:

content:test

hashid:G9LmrBnbWNe8IlEFVgC6NcBqzqNP4VEk

value:[123, 456, 100, 200, 300]


其他参考:

1、hashids官网:https://hashids.org/

2、《Generating YouTube-like IDs in Postgres using PL/V8 and Hashids》:https://abevoelker.com/generating-youtube-like-ids-in-postgres-using-plv8-and-hashids/

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
4月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
26天前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
106 0
|
26天前
|
数据采集 运维 监控
|
2月前
高性能网络库设计之日志组件
高性能网络库设计之日志组件
91 2
|
3月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
320 4
|
10月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
2787 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
9月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
243 9
|
7月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
573 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
6月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
426 13