【发布时间】:2015-11-17 15:24:17
【问题描述】:
我需要在 Postgresql 中生成固定长度为 13 位的唯一随机数。 我发现了一个类似的thread,其中使用了使用“pseudo_encrypt”加密的序列,但返回的数字不是固定长度。
所以,我需要的是:得到一个固定长度为 13 位的加密随机序列,其中最小值为 0000000000001,最大值为 9999999999999。
有可能吗?如果不可能从前面的零开始不是一个大问题(我认为),我可以在从数据库读取期间以编程方式设置它们,但如果 Postgresql 可以自己做到这一点,那就太好了。
-- 编辑--
在意识到一些有用的事情之后,我必须改变问题以便更好地解释我需要什么:
我需要在 Postgresql 中生成唯一的随机数 (bigint),最大长度固定为 13 位。实际上我正在尝试使用pseudo_encrypt 函数(64 位),但返回的数字显然不是固定的最大长度 13,在 32 位的情况下,最大长度是 10 位(整数),而对于 64位是 19 (bigint)。
那么,如何得到一个最大长度固定为 13 位、最小值为 1、最大值为 9999999999999 的加密随机序列?
是否可以修改 64 位 pseudo_ecrypt 函数以获得此结果?或者如果不可能,还有其他方法可以获得满足此要求的唯一序列吗?
伪加密函数(64 位)
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 bigint;
l2 bigint;
r1 bigint;
r2 bigint;
i int:=0;
BEGIN
l1:= (VALUE >> 32) & 4294967295::bigint;
r1:= VALUE & 4294967295;
WHILE i < 3 LOOP
l2 := r1;
r2 := l1 # ((((1366.0 * r1 + 150889) % 714025) / 714025.0) * 32767*32767)::int;
l1 := l2;
r1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::bigint << 32) + r1);
END;
$$ LANGUAGE plpgsql strict immutable;
【问题讨论】:
-
您可以将该函数的返回值格式化为固定长度:
to_char(pseudo_encrypt(nextval('seq')::int), '0000000000000') -
那么序列呢?我必须如何设置它?
-
与您链接到的问题相同。只需确保您的最大值不超过 13 位即可。
-
好的,我试试,我告诉你,谢谢!
-
我可以第一个迂腐地声明,如果这些值是唯一的,那么根据定义,它们也不能都是随机的。谢谢。
标签: postgresql random