PostgreSQL使用擴(kuò)展插件pgcrypto,生成隨機(jī)int8值
在PostgreSQL中,可以使用 pgcrypto
擴(kuò)展提供的函數(shù) gen_random_uuid()
生成隨機(jī)的UUID(Universally Unique Identifier),其中包含8字節(jié)隨機(jī)整數(shù)(int8值),如下所示:
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
SELECT substring(gen_random_uuid()::text from 1 for 16)::bit(64)::bigint;
上述SQL語(yǔ)句使用 gen_random_uuid()
函數(shù)生成隨機(jī)UUID,并將其轉(zhuǎn)換為字符串類型。然后,使用 substring()
函數(shù)從字符串中提取前16個(gè)字符,并將其轉(zhuǎn)換為 bit(64)
類型。最后,使用 bigint
類型進(jìn)行值的轉(zhuǎn)換,得到一個(gè)隨機(jī)的8字節(jié)整數(shù)(int8值)。
PostgreSQL不使用擴(kuò)展,生成隨機(jī)int8值
不使用 pgcrypto
擴(kuò)展,可以使用 Postgres 內(nèi)置的 random()
函數(shù)生成隨機(jī)數(shù),并將其轉(zhuǎn)換為您需要的整數(shù)類型。以下是一個(gè)示例 SQL 語(yǔ)句,可以生成一個(gè)隨機(jī)的8字節(jié)整數(shù):
SELECT floor(random() * 9223372036854775807)::bigint;
在上述語(yǔ)句中,random()
函數(shù)返回一個(gè) [0, 1) 之間的浮點(diǎn)數(shù),將其乘以 9223372036854775807(2^63 - 1),得到一個(gè) [0, 9223372036854775807) 之間的浮點(diǎn)數(shù)。然后使用 floor()
函數(shù)將其轉(zhuǎn)換為一個(gè)整數(shù),并使用 ::bigint
將其轉(zhuǎn)換為一個(gè)64位的整數(shù)類型(bigint)。
請(qǐng)注意,由于 random()
函數(shù)返回浮點(diǎn)數(shù),因此生成的整數(shù)并不是均勻分布的。如果需要更好的隨機(jī)性能,請(qǐng)考慮使用 pgcrypto
擴(kuò)展中提供的隨機(jī)數(shù)生成函數(shù)。
PostgreSQL不使用擴(kuò)展,生成均勻分布的隨機(jī)int8值
如果需要生成均勻分布的隨機(jī)int8值,可以使用 Postgres 內(nèi)置的 random()
函數(shù)和位運(yùn)算符來(lái)生成。以下是一個(gè)示例 SQL 語(yǔ)句,可以生成一個(gè)均勻分布的隨機(jī)8字節(jié)整數(shù):
SELECT trunc(random()*pow(2,64)::numeric)::bigint^trunc(random()*pow(2,64)::numeric)::bigint;
在上述語(yǔ)句中,我們使用 pow()
函數(shù)計(jì)算出一個(gè)64位無(wú)符號(hào)整數(shù)的最大值(2的64次方),然后將該值轉(zhuǎn)換為 numeric
類型。接下來(lái),我們使用 random()
函數(shù)兩次產(chǎn)生兩個(gè)0到1之間的隨機(jī)數(shù),并將它們乘以最大值,得到兩個(gè)潛在的64位無(wú)符號(hào)整數(shù)值。使用 trunc()
函數(shù)將它們轉(zhuǎn)換為整數(shù),并分別將它們按位異或,得到一個(gè)均勻分布的隨機(jī)8字節(jié)整數(shù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-488051.html
值得注意的是,這種方法也不是完美的均勻分布,但已經(jīng)足夠用于大多數(shù)情況。如果需要更高質(zhì)量的隨機(jī)整數(shù),請(qǐng)使用 pgcrypto
擴(kuò)展中提供的隨機(jī)數(shù)生成函數(shù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-488051.html
到了這里,關(guān)于PostgreSQL不使用擴(kuò)展,生成隨機(jī)int8值,生成均勻分布的隨機(jī)int8值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!