我的工作产生像在回答#2随机IDS系统上这里.
我的问题是,提到的pseudo_encrypt()函数适用于int而不是bigint.我试图重写它,但它返回总是相同的结果:
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 bigint;
l2 int;
r1 bigint;
r2 int;
i int:=0;
BEGIN
l1:= (VALUE >> 32) & 4294967296::bigint;
r1:= VALUE & 4294967296;
WHILE i < 3 LOOP
l2 := r1;
r2 := l1 # ((((1366.0 * r1 + 150889) % 714025) / 714025.0) * 32767)::int;
l1 := l2;
r1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::bigint << 32) + r1); …Run Code Online (Sandbox Code Playgroud) 我需要在Postgresql中生成固定长度为13位的唯一随机数.我发现了一个类似的线程,其中使用了使用"pseudo_encrypt"加密的序列,但返回的数字没有固定的长度.
所以,我需要的是:得到一个固定长度为13位的加密随机序列,其中最小值为0000000000001,最大值为9999999999999.
可能吗?如果从前面的零开始是不可能的不是一个大问题(我认为),我可以在从数据库读取时以编程方式设置它们,但如果Postgresql可以自己完成它将会很棒.
- 编辑 -
在实现了一些有用的东西后,我必须改变问题,以便更好地解释我需要的东西:
我需要在Postgresql中生成唯一的随机数(bigint),其最大长度为13位.实际上我正在尝试使用pseudo_encrypt函数(64位),但返回的数字显然没有固定的最大长度为13,在32位情况下,最大长度为10位(int),而对于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 + …Run Code Online (Sandbox Code Playgroud)