问题当然是:为什么要随机 ID?
我遇到类似要求的一个案例是 webapp 的客户端 ID:客户端用他的客户端 ID(存储在 cookie 中)来标识自己,因此必须很难暴力猜测另一个客户端的 ID(因为这将允许劫持他的数据)。
我采用的解决方案是将顺序 int32 与随机 int32 组合以获得我用作客户端 ID 的 int64。在 PostgreSQL 中:
CREATE FUNCTION lift(integer, integer) returns bigint AS $$
SELECT ($1::bigint << 31) + $2
$$ LANGUAGE SQL;
CREATE FUNCTION random_pos_int() RETURNS integer AS $$
select floor((lift(1,0) - 1)*random())::integer
$$ LANGUAGE sql;
ALTER TABLE client ALTER COLUMN id SET DEFAULT
lift((nextval('client_id_seq'::regclass))::integer, random_pos_int());
生成的 ID 是“一半”随机的,而另一“半”保证您不能两次获得相同的 ID:
select lift(1, random_pos_int()); => 3108167398
select lift(2, random_pos_int()); => 4673906795
select lift(3, random_pos_int()); => 7414644984
...