随机生成 public 个唯一 ID

Randomly generated public unique ids

目前,我正在使用 int 和 auto_increment 为数据库中的行生成唯一 ID。这些 id 是 public 面向所以在 url 你可以看到这样的东西 https://example.com/path/1https://example.com/path/2

在与另一位工程师交谈后,他们建议我应该使用随机生成的 ID,这样它们就不会被猜到。

我如何生成一个唯一的 ID,而不是每次都对数据库执行 forloop 以确保它是唯一的?例如以条纹为例。他们所有的 id 都是 price_sdfgsdfgprod_iisdfgsdfg。为这些行生成唯一 ID 的最佳方法是什么?

在不知道您使用的是哪种语言或数据库的情况下,最简单的方法是使用 uuids。

为了防止下载所有现有的数据库唯一键,然后循环遍历它们,只需尝试 INSERT INTO 您正在使用的 table 即可。

如果结果失败(例如 Exception),则取该行,继续。

如果结果通过,则中断循环。

只有当您的列为 NOT NULLUNIQUE.

时才有效

这就是我“知道”的方式,无需遍历整个 ID 数据库或将它们下载到本地内存等

使用 auto_increment 不会导致重复,因为当使用 SQL 或 no-SQL table 时,它将被 锁定 并赋予队列中的下一个可用数字,这就是数据库的美妙之处。

SQL 示例(mySQL、SQLite、mariadb):

CREATE TABLE `my_db`.`my_table` ( `unique_id` INT NOT NULL , UNIQUE (`unique_id`)) ENGINE = InnoDB;`

插入一个unique_id

INSERT INTO `test` (`unique_id`) VALUES ('999999999');

太好了,我们有一个排

INSERT INTO `test` (`unique_id`) VALUES ('999999999');

如果没有,则重试:

错误:

#1062 - Duplicate entry '999999999' for key 'unique_id'

如果这些是 public 网址,并且内容敏感,那么我绝对不推荐 int,因为有人可以轻易地猜到 1 到 99999999... 等

任何语言,看看/dev/urandom

在 shell/bash 脚本中,我可能会使用 uuidgen: 9dccd646-043e-4984-9126-3060b4ced180

在 Python 中,我将使用 pandas:

df.set_index(pd.util.hash_pandas_object(df, encoding='utf8'), drop=True, inplace=True)
df.index.rename('hash', inplace=True)

最后,UUID 并不完美:它们只是 a-f 0-9 全小写,但它们很容易生成:每种语言都有一个。

在 JavaScript 中,您可能想查看一些安全的开源应用程序,例如 Jitsi:https://github.com/jitsi/js-utils/blob/master/random/roomNameGenerator.js 它们共轭词:

例如Satisfied-Global-Architectural-Bitter