增强 Jack Douglas 的回答以避免需要 PL/PgSQL 循环和 bytea 连接,您可以使用:
CREATE OR REPLACE FUNCTION random_bytea(bytea_length integer)
RETURNS bytea AS $body$
SELECT decode(string_agg(lpad(to_hex(width_bucket(random(), 0, 1, 256)-1),2,'0') ,''), 'hex')
FROM generate_series(1, $1);
$body$
LANGUAGE 'sql'
VOLATILE
SET search_path = 'pg_catalog';
create function random_bytea(p_length in integer) returns bytea language plpgsql as $$
declare
o bytea := '';
begin
for i in 1..p_length loop
o := o||decode(lpad(to_hex(width_bucket(random(), 0, 1, 256)-1),2,'0'), 'hex');
end loop;
return o;
end;$$;
增强 Jack Douglas 的回答以避免需要 PL/PgSQL 循环和 bytea 连接,您可以使用:
SQL
这是一个比 PL/PgSQL 调用更便宜的简单函数。bytea
对于较大的值,由于更改聚合方法导致的性能差异是巨大的。尽管对于小于 50 字节的大小,原始函数实际上快了 3 倍,但对于较大的值,这个函数的扩展性要好得多。或使用 C 扩展函数:
我已经实现了一个随机 bytea 生成器作为一个简单的 C 扩展函数。它位于我在 GitHub 上的 scrapcode 存储库中。请参阅那里的自述文件。
它会破坏上述 SQL 版本的性能:
这个函数会做,但是 1Gb 会花费很长时间,因为它不会随着输出长度线性缩放:
输出测试:
dbfiddle在这里
pgcrypto扩展有
gen_random_bytes(count integer)
:create extension
唯一需要做的就是一次。