一些介绍:在考虑了将在 URL 和其他地方使用的唯一 ID 类型之后,我选择了线性同余生成器 ( http://en.wikipedia.org/wiki/Linear_congruential_generator )。为什么不使用 UUID 或自动增量?
- UUID 太长且难以存储在 db 中(推荐的方法是将它们转换为 VARBINARY(16))。
- Auto_increment 公开了新实体的注册和添加序列,并提供了预测下一个 id 的能力。例如,如果一个服务流行起来,用户可以多次注册以获得一个不错的 id,然后尝试出售这样的帐户,id 会给出某种状态:注册越早越酷。我宁愿避免这样的事情。
使用 LCG,序列是随机的,我可以选择参数,以便可能的值很好地适合特定目的的数据类型。例如,对用户 ID 使用 INT UNSIGNED 并选择参数以给出 2^32 的周期。
问题是要生成下一个 id,我需要获取最后一个 id 的值:
nextId = (a * lastId + c) % m
- 据我了解,我必须自己设置第一个 ID?我选择哪个号码重要吗?
- 什么是生成新 ID 的巧妙方法?也许创建一个表,其中包含每个表的最后生成的 id 列表?或者在每个表中添加一个 auto_increment 列来跟踪最后生成的 id?又如何在短时间内出现大量注册时避免出现问题?
更新1 : 我找到了一种使用此处信息的多用户安全方法:http: //dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id
CREATE TABLE sequences (users INT UNSIGNED NOT NULL, posts BIGINT UNSIGNED NOT NULL);
INSERT INTO sequences VALUES(123456,123456789);
然后得到一个新的ID:
UPDATE sequences SET users=LAST_INSERT_ID((a * users + c) % m);
SELECT LAST_INSERT_ID();