• 什么是 Sqids?

    Sqids是一个小型的开源库,可以从数字生成短、唯一、看起来随机的ID。

    最好的思考方式是将其视为十进制到十六进制的转换器,但带有一些额外的功能。

  • 用于链接缩短,为日志生成唯一事件ID,为网站上的产品/对象生成ID(就像YouTube为视频所做的那样),为文本消息生成短ID,邮件确认代码等。

  • 任何不敏感的数据。生成的ID不是哈希值,可以解码回数字。例如,它们可能不是用户ID的好选择,因为一旦解码,它们可能会透露您应用的用户数量。

  • 我可以同时编码多个数字吗?

    可以。Sqids可以将一个或多个非负数编码为单个ID。您可以编码的数字数量没有限制,但可以编码的数字大小有限(取决于实现语言)。

    出于几个原因很有用:您可以编码UNIX时间戳并创建过期ID,或者您可以将数据库分片号与主键一起编码,并节省额外的数据库查询。

  • 生成的ID是唯一的吗?

    是的,生成的ID对于输入和字母表是唯一的。

    请记住,默认字母表包含大写和小写字母,因此默认ID是区分大小写的。

  • Sqids 有什么限制?

    Sqids无法编码负数。

    最小字母表长度为3个字符。

    字母表不能包含任何多字节字符。

    Sqids不能生成特定长度的ID,只能生成至少特定长度的ID。最小长度参数范围介于0和255之间。

    Sqids可以尝试重新生成ID,直到字母表长度减一。

  • 如何使我的ID唯一?

    该库接受自定义字母表,可以从中生成ID。只需预先洗牌提供的默认字母表。

    请记住,如果付出足够的努力,有人可能会逆向工程您的洗牌字母表,因此这绝不是隐藏敏感数据的技术。

  • 如何对默认字母表进行洗牌?

    默认字母表可以在此处 找到。

    您可以使用任何在线字符串洗牌工具或我们的游乐场

  • 使用较短或较长的字母表更好吗?

    取决于您的用例。较短的字母表会生成较长的ID,较长的字母表会生成较短的ID。您可以使用游乐场 来测试您的ID可能的外观。

  • 我的字母表可以只包含数字吗?

    可以。请记住,生成的ID仍然是字符串,可能以零开头。

  • 我可以使用表情符号作为字母表吗?

    不,Sqids不支持字母表中的多字节字符。这包括表情符号以及许多其他字符。

  • 为什么要填充ID?

    该库可以使用垃圾字符扩展ID,使它们看起来更长。这很有用,这样您就不会很明显地编码一个像1这样的小数或1000000这样的大数。

    解码不受影响。

  • 我可以使生成的ID更长吗?

    是的,该库接受最小长度参数,确保ID至少具有该长度。

    请注意,对于ID的长度没有保证——只能确保它们不会短于您指定的长度。

  • 我可以将生成的ID设置为特定长度吗?

    只能到某个程度。

    设置最大长度是不可能的,因为随着输入的增大,您的ID迟早会溢出。这就是为什么只支持最小长度参数,而不支持确切长度或最大长度。

  • 为什么要使用阻止清单?

    屏蔽列表可以防止某些单词出现在您的ID中。这很有益,因为生成的ID应该出现在公共场合,比如URL。

    Sqids附带了包含几种语言中最基本的粗话和不当单词的默认屏蔽列表 。当然,您可以用您自己的单词扩展该屏蔽列表。

  • 阻止清单是如何工作的?

    屏蔽列表单词匹配不区分大小写。

    长度少于3个字符的短词将不被屏蔽。长度为3个字符的词必须与ID完全匹配。长度为4个字符或更长的词,如果它们是ID的子字符串,则会触发匹配。

    如果屏蔽列表中的单词包含数字(类似1337),它们只会在ID的开头或结尾时触发匹配。

  • 默认阻止清单中有哪些词语?

    默认的屏蔽列表包含几种语言中最常见的粗话和不当单词。您可以在此处 找到完整列表。

  • 当所有ID都被阻止时会发生什么?

    当生成的ID与屏蔽列表中的单词匹配时,库会尝试重新生成它。

    如果每一次尝试重新生成ID都失败了,编码函数将失败并返回错误。处理该错误由用户负责。

    减少重新生成尝试次数的最佳方法是使用更长的字母表,不设置最小长度,并提供更小的屏蔽列表。提供空屏蔽列表将完全禁用该功能。

  • 如何检查ID是否有效?

    解码ID通常会产生某种数字输出,但这并不一定意味着ID是规范的。要检查ID是否有效,您可以重新对解码后的数字进行编码并检查ID是否匹配。

    之所以不自动完成这一步骤,是因为如果默认的屏蔽列表在将来更改,我们不希望自动失效以前生成的ID,而这些ID可能现在匹配了新的屏蔽列表单词。

  • 默认阻止清单更新时会发生什么?

    如果默认的屏蔽列表更改,我们将确保更新CHANGELOG。

    您必须考虑到可能会有新词加入默认的屏蔽列表的情况。在这种情况下,重新对解码后的数字进行编码可能会产生不同的ID。

    确保您的ID在未来更新中保持一致的最佳方法是提供自定义的屏蔽列表,即使它与当前默认的屏蔽列表相同。

  • 编码不同数字是否会产生相同的ID?

    不会,编码不同的数字将产生唯一的ID。

    然而,由于算法设计的原因,解码随机ID有时可能会产生相同的数字。检查ID是否规范的最佳方法是简单地重新对解码后的数字进行编码并检查ID是否匹配。

  • 什么是 Hashids?

    Hashids是该库的第一个版本,大约在2013年发布。它也生成了短ID,但使用了稍微不同的方法。

  • Hashids为何升级到Sqids?

    Hashids处理方式有所不同。

    它不支持自定义阻止列表,而是依赖于最常见的英文粗话。它还使用了salt参数来洗牌字母表,这有点令人困惑,因为该库与加密无关。此外,它使用了太多保留字符,导致生成的ID更长。

    因此,我们决定升级和重新品牌。算法已经简化,添加了一些功能,并且代码存储库现在全部集中在 一个地方

  • 为什么移除了salt参数?

    salt参数被用来洗牌字母表,但从未旨在与安全性或安全性相关联。Hashids和Sqids都类似于十进制到十六进制转换的工作方式,但进行了一些调整。没有任何形式的加密,为了避免混淆,该参数已完全删除。

  • Hashids与Sqids兼容吗?

    不,Sqids扩展了Hashids的功能,并具有不同的设计目标和要求;因此,生成的ID与Hashids不兼容。

  • 我如何安全地从Hashids升级到Sqids?

    由于Hashids和Sqids之间没有兼容性,简单地用Sqids替换Hashids是不可能的。

    不过,您可以通过区分哪个ID属于哪个库来合并这两个库。

    其中一种方法是通过ID长度 - 如果要切换到Sqids,您可以提供更高的最小长度。另一种方法是手动将自定义字符附加/添加到新生成的ID。

    最后,您还可以尝试使用Hashids解码ID,看看它是否有效。如果无效 - 使用Sqids解码和重新编码,看看是否有效。

  • 我在哪里找到原始的Hashids库?

    此网站上的每种语言实现都链接到原始的Hashids存储库(如果存在)。

  • 我如何贡献?

    如果您想支持该项目,我们将感谢您在Github上给我们的存储库加星,以提高其可见性。

    如果您是开发人员,并且对某种特定语言没有Sqids的实现,请帮助我们转换该库。同样适用于未列出的编程语言。

    如果您发现规范或任何实现中存在错误,请在适当的存储库中创建问题或拉取请求,提出修复建议。

    如果您懂多种语言,我们可以使用您的帮助来 优化阻止列表 调整网站翻译 ,如果存在任何问题。

    最后,如果您对Hashids/Sqids有一些经验,请帮助引导我们的社区,回答任何人可能遇到的问题。

  • 如何将Sqids移植到另一种语言?

    如果您想要将Sqids移植到以下语言之一(或者没有列出的新语言):

    D , Io , Raku , Smalltalk , T-SQL , Tcl , VBA

    将官方存储库分叉到您自己的Github帐户中,并实现 规范 以及所有测试。您可以重新使用任何现有的README文件(示例 )。

    一旦库准备就绪,请创建拉取请求。合并后,我们将更新网站。

    如果存储库没有活跃的维护者,我们将很乐意邀请您管理该存储库并成为官方维护者。