阿里云日志服务介绍
日志服务(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/1、https://example.com/products/2、https://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/NV、https://example.com/products/6m、https://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/