Sqids是一个小型的开源库,可以从数字生成短、唯一、看起来随机的ID。
最好的思考方式是将其视为十进制到十六进制的转换器,但带有一些额外的功能。
用于链接缩短,为日志生成唯一事件ID,为网站上的产品/对象生成ID(就像YouTube为视频所做的那样),为文本消息生成短ID,邮件确认代码等。
任何不敏感的数据。生成的ID不是哈希值,可以解码回数字。例如,它们可能不是用户ID的好选择,因为一旦解码,它们可能会透露您应用的用户数量。
可以。Sqids可以将一个或多个非负数编码为单个ID。您可以编码的数字数量没有限制,但可以编码的数字大小有限(取决于实现语言)。
出于几个原因很有用:您可以编码UNIX时间戳并创建过期ID,或者您可以将数据库分片号与主键一起编码,并节省额外的数据库查询。
是的,生成的ID对于输入和字母表是唯一的。
请记住,默认字母表包含大写和小写字母,因此默认ID是区分大小写的。
Sqids无法编码负数。
最小字母表长度为3个字符。
字母表不能包含任何多字节字符。
Sqids不能生成特定长度的ID,只能生成至少特定长度的ID。最小长度参数范围介于0和255之间。
Sqids可以尝试重新生成ID,直到字母表长度减一。
该库接受自定义字母表,可以从中生成ID。只需预先洗牌提供的默认字母表。
请记住,如果付出足够的努力,有人可能会逆向工程您的洗牌字母表,因此这绝不是隐藏敏感数据的技术。
取决于您的用例。较短的字母表会生成较长的ID,较长的字母表会生成较短的ID。您可以使用游乐场 来测试您的ID可能的外观。
可以。请记住,生成的ID仍然是字符串,可能以零开头。
不,Sqids不支持字母表中的多字节字符。这包括表情符号以及许多其他字符。
该库可以使用垃圾字符扩展ID,使它们看起来更长。这很有用,这样您就不会很明显地编码一个像1这样的小数或1000000这样的大数。
解码不受影响。
是的,该库接受最小长度参数,确保ID至少具有该长度。
请注意,对于ID的长度没有保证——只能确保它们不会短于您指定的长度。
只能到某个程度。
设置最大长度是不可能的,因为随着输入的增大,您的ID迟早会溢出。这就是为什么只支持最小长度参数,而不支持确切长度或最大长度。
屏蔽列表可以防止某些单词出现在您的ID中。这很有益,因为生成的ID应该出现在公共场合,比如URL。
Sqids附带了包含几种语言中最基本的粗话和不当单词的默认屏蔽列表 。当然,您可以用您自己的单词扩展该屏蔽列表。
屏蔽列表单词匹配不区分大小写。
长度少于3个字符的短词将不被屏蔽。长度为3个字符的词必须与ID完全匹配。长度为4个字符或更长的词,如果它们是ID的子字符串,则会触发匹配。
如果屏蔽列表中的单词包含数字(类似1337),它们只会在ID的开头或结尾时触发匹配。
默认的屏蔽列表包含几种语言中最常见的粗话和不当单词。您可以在此处 找到完整列表。
当生成的ID与屏蔽列表中的单词匹配时,库会尝试重新生成它。
如果每一次尝试重新生成ID都失败了,编码函数将失败并返回错误。处理该错误由用户负责。
减少重新生成尝试次数的最佳方法是使用更长的字母表,不设置最小长度,并提供更小的屏蔽列表。提供空屏蔽列表将完全禁用该功能。
解码ID通常会产生某种数字输出,但这并不一定意味着ID是规范的。要检查ID是否有效,您可以重新对解码后的数字进行编码并检查ID是否匹配。
之所以不自动完成这一步骤,是因为如果默认的屏蔽列表在将来更改,我们不希望自动失效以前生成的ID,而这些ID可能现在匹配了新的屏蔽列表单词。
如果默认的屏蔽列表更改,我们将确保更新CHANGELOG。
您必须考虑到可能会有新词加入默认的屏蔽列表的情况。在这种情况下,重新对解码后的数字进行编码可能会产生不同的ID。
确保您的ID在未来更新中保持一致的最佳方法是提供自定义的屏蔽列表,即使它与当前默认的屏蔽列表相同。
不会,编码不同的数字将产生唯一的ID。
然而,由于算法设计的原因,解码随机ID有时可能会产生相同的数字。检查ID是否规范的最佳方法是简单地重新对解码后的数字进行编码并检查ID是否匹配。
Hashids是该库的第一个版本,大约在2013年发布。它也生成了短ID,但使用了稍微不同的方法。
Hashids处理方式有所不同。
它不支持自定义阻止列表,而是依赖于最常见的英文粗话。它还使用了salt参数来洗牌字母表,这有点令人困惑,因为该库与加密无关。此外,它使用了太多保留字符,导致生成的ID更长。
因此,我们决定升级和重新品牌。算法已经简化,添加了一些功能,并且代码存储库现在全部集中在 一个地方 。
salt参数被用来洗牌字母表,但从未旨在与安全性或安全性相关联。Hashids和Sqids都类似于十进制到十六进制转换的工作方式,但进行了一些调整。没有任何形式的加密,为了避免混淆,该参数已完全删除。
不,Sqids扩展了Hashids的功能,并具有不同的设计目标和要求;因此,生成的ID与Hashids不兼容。
由于Hashids和Sqids之间没有兼容性,简单地用Sqids替换Hashids是不可能的。
不过,您可以通过区分哪个ID属于哪个库来合并这两个库。
其中一种方法是通过ID长度 - 如果要切换到Sqids,您可以提供更高的最小长度。另一种方法是手动将自定义字符附加/添加到新生成的ID。
最后,您还可以尝试使用Hashids解码ID,看看它是否有效。如果无效 - 使用Sqids解码和重新编码,看看是否有效。
此网站上的每种语言实现都链接到原始的Hashids存储库(如果存在)。