您现在的位置是:首页 >学无止境 >PostgreSQL不使用扩展,生成随机int8值,生成均匀分布的随机int8值网站首页学无止境

PostgreSQL不使用扩展,生成随机int8值,生成均匀分布的随机int8值

ac.char 2024-09-30 00:01:04
简介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 扩展中提供的随机数生成函数。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。