您现在的位置是:首页 >学无止境 >PostgreSQL不使用扩展,生成随机int8值,生成均匀分布的随机int8值网站首页学无止境
PostgreSQL不使用扩展,生成随机int8值,生成均匀分布的随机int8值
PostgreSQL不使用扩展,生成随机int8值,生成均匀分布的随机int8值
PostgreSQL使用扩展插件pgcrypto,生成随机int8值
在PostgreSQL中,可以使用 pgcrypto
扩展提供的函数 gen_random_uuid()
生成随机的UUID(Universally Unique Identifier),其中包含8字节随机整数(int8值),如下所示:
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
SELECT substring(gen_random_uuid()::text from 1 for 16)::bit(64)::bigint;
上述SQL语句使用 gen_random_uuid()
函数生成随机UUID,并将其转换为字符串类型。然后,使用 substring()
函数从字符串中提取前16个字符,并将其转换为 bit(64)
类型。最后,使用 bigint
类型进行值的转换,得到一个随机的8字节整数(int8值)。
PostgreSQL不使用扩展,生成随机int8值
不使用 pgcrypto
扩展,可以使用 Postgres 内置的 random()
函数生成随机数,并将其转换为您需要的整数类型。以下是一个示例 SQL 语句,可以生成一个随机的8字节整数:
SELECT floor(random() * 9223372036854775807)::bigint;
在上述语句中,random()
函数返回一个 [0, 1) 之间的浮点数,将其乘以 9223372036854775807(2^63 - 1),得到一个 [0, 9223372036854775807) 之间的浮点数。然后使用 floor()
函数将其转换为一个整数,并使用 ::bigint
将其转换为一个64位的整数类型(bigint)。
请注意,由于 random()
函数返回浮点数,因此生成的整数并不是均匀分布的。如果需要更好的随机性能,请考虑使用 pgcrypto
扩展中提供的随机数生成函数。
PostgreSQL不使用扩展,生成均匀分布的随机int8值
如果需要生成均匀分布的随机int8值,可以使用 Postgres 内置的 random()
函数和位运算符来生成。以下是一个示例 SQL 语句,可以生成一个均匀分布的随机8字节整数:
SELECT trunc(random()*pow(2,64)::numeric)::bigint^trunc(random()*pow(2,64)::numeric)::bigint;
在上述语句中,我们使用 pow()
函数计算出一个64位无符号整数的最大值(2的64次方),然后将该值转换为 numeric
类型。接下来,我们使用 random()
函数两次产生两个0到1之间的随机数,并将它们乘以最大值,得到两个潜在的64位无符号整数值。使用 trunc()
函数将它们转换为整数,并分别将它们按位异或,得到一个均匀分布的随机8字节整数。
值得注意的是,这种方法也不是完美的均匀分布,但已经足够用于大多数情况。如果需要更高质量的随机整数,请使用 pgcrypto
扩展中提供的随机数生成函数。