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/

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
16天前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
20 2
|
1月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
165 3
|
28天前
|
存储 运维 监控
超级好用的C++实用库之日志类
超级好用的C++实用库之日志类
28 0
|
2月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
44 0
|
2月前
|
开发者 前端开发 编解码
Vaadin解锁移动适配新境界:一招制胜,让你的应用征服所有屏幕!
【8月更文挑战第31天】在移动互联网时代,跨平台应用开发备受青睐。作为一款基于Java的Web应用框架,Vaadin凭借其组件化设计和强大的服务器端渲染能力,助力开发者轻松构建多设备适应的Web应用。本文探讨Vaadin与移动设备的适配策略,包括响应式布局、CSS媒体查询、TouchKit插件及服务器端优化,帮助开发者打造美观且实用的移动端体验。通过这些工具和策略的应用,可有效应对屏幕尺寸、分辨率及操作系统的多样性挑战,满足广大移动用户的使用需求。
45 0
|
2月前
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
39 0
|
12天前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
87 3
|
2月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
110 3
|
13天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1576 12
|
8天前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
15 0