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 扩展中提供的随机数生成函数。文章来源地址https://www.toymoban.com/news/detail-488051.html

到了这里,关于PostgreSQL不使用扩展,生成随机int8值,生成均匀分布的随机int8值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包