随机生成 public 个唯一 ID
Randomly generated public unique ids
目前,我正在使用 int 和 auto_increment 为数据库中的行生成唯一 ID。这些 id 是 public 面向所以在 url 你可以看到这样的东西 https://example.com/path/1
或 https://example.com/path/2
在与另一位工程师交谈后,他们建议我应该使用随机生成的 ID,这样它们就不会被猜到。
我如何生成一个唯一的 ID,而不是每次都对数据库执行 forloop 以确保它是唯一的?例如以条纹为例。他们所有的 id 都是 price_sdfgsdfg
或 prod_iisdfgsdfg
。为这些行生成唯一 ID 的最佳方法是什么?
在不知道您使用的是哪种语言或数据库的情况下,最简单的方法是使用 uuid
s。
为了防止下载所有现有的数据库唯一键,然后循环遍历它们,只需尝试 INSERT INTO
您正在使用的 table 即可。
如果结果失败(例如 Exception),则取该行,继续。
如果结果通过,则中断循环。
只有当您的列为 NOT NULL
且 UNIQUE
.
时才有效
这就是我“知道”的方式,无需遍历整个 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
目前,我正在使用 int 和 auto_increment 为数据库中的行生成唯一 ID。这些 id 是 public 面向所以在 url 你可以看到这样的东西 https://example.com/path/1
或 https://example.com/path/2
在与另一位工程师交谈后,他们建议我应该使用随机生成的 ID,这样它们就不会被猜到。
我如何生成一个唯一的 ID,而不是每次都对数据库执行 forloop 以确保它是唯一的?例如以条纹为例。他们所有的 id 都是 price_sdfgsdfg
或 prod_iisdfgsdfg
。为这些行生成唯一 ID 的最佳方法是什么?
在不知道您使用的是哪种语言或数据库的情况下,最简单的方法是使用 uuid
s。
为了防止下载所有现有的数据库唯一键,然后循环遍历它们,只需尝试 INSERT INTO
您正在使用的 table 即可。
如果结果失败(例如 Exception),则取该行,继续。
如果结果通过,则中断循环。
只有当您的列为 NOT NULL
且 UNIQUE
.
这就是我“知道”的方式,无需遍历整个 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