如何生成 4 位唯一 id,如 discord id,如 #8052

Posted

技术标签:

【中文标题】如何生成 4 位唯一 id,如 discord id,如 #8052【英文标题】:How to generate 4 digit unique id like discord id like #8052 【发布时间】:2017-06-02 07:15:39 【问题描述】:
 DECLARE @chars NCHAR(36)
SET @chars = N'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

DECLARE @result NCHAR(4)
SET @result = SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)
            + SUBSTRING(@chars, CAST((RAND() * LEN(@chars)) AS INT) + 1, 1)

SELECT @result

我试试这个,但它太长了我使用 nodejs 和 posgresql

【问题讨论】:

什么是“discord id”?显示一个例子。说明约束是什么。目前尚不清楚为什么您的问题中有奇怪的 alpha 字符字符串。 点赞 #8016 @jdv 您应该在原始问题中填写详细信息,可以通过单击edit按钮进行编辑。 你只需要一个特定范围内的随机数? ***.com/q/2175512/1531971 请不要破坏您的帖子。根据您在此处发布时接受的许可,它不再是您的专属。 【参考方案1】:

您可以使用 Node.js 应用程序生成 id。随机使用Math

Math.random().toString(36).substr(2, 4) // You can change the `4` to change the length.

它会输出这样的字符串:92q6

详细说明:

Math.random() // 0.2433971674181521
Math.random().toString(36) // 0.ghlhdmdypp8bmx6r

javascript 中数字类型的 toString 方法采用可选参数将数字转换为给定的基数。例如,如果您传递两个,您将看到以二进制表示的数字。与十六进制(以 16 为底)类似,以 36 为底使用字母来表示 9 以外的数字。通过将随机数转换为以 36 为底的数字,您最终会得到一堆看似随机的字母和数字。

——Chris Baker

【讨论】:

嗨,兄弟,谢谢你回答它可以产生多少变化,如果有的话,它有多少限制。 你是对的,如果你想得到一个真正独特的随机,你必须使用另一种方式。正如 Math.random() MDN 页面中提到的那样:“Math.random() 不提供加密安全的随机数。不要将它们用于与安全相关的任何事情。改用 Web Crypto API,更准确地说是 window.crypto .getRandomValues() 方法。” - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案2】:

由于您使用的是 nodejs,您可以在数据库中使用标准整数,并在向用户显示时将其转换为 base36。在javascript中,数字上toString的参数是基数:

a = 46656
b = a.toString(36) // b = "1000"

如果你想将它从 base36 转换回数字,请使用parseInt:

b = "1000"
c = parseInt(c, 36) // c = 46656

如果您希望字符串为 4 个字符,请生成一个介于 46656(“1000”)和 1679615(“zzzz”)之间的数字。

【讨论】:

以上是关于如何生成 4 位唯一 id,如 discord id,如 #8052的主要内容,如果未能解决你的问题,请参考以下文章

Redis-全局唯一ID

如何在 SQL 中自动生成唯一 ID,如 UID12345678?

如何为熊猫数据框添加唯一的字母数字 ID?

如何用redis来生成唯一Id

5位ID生成方案

如何在 Dart 中生成唯一 id