• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
ac.char
帮助1

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 扩展中提供的随机数生成函数。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfkfgke
系列文章
更多 icon
同类精品
更多 icon
继续加载