PostgreSQL的random()函数在不同操作系统下的运行结果是否可复现?
PostgreSQL版本是判断random()跨平台一致性的核心依据
- PostgreSQL 11及以上版本:
random()的伪随机数生成逻辑完全由PostgreSQL自研实现,不依赖任何操作系统底层的随机函数。只要调用前设置的setseed参数相同、random()的调用顺序完全一致,不管运行在Windows、macOS还是Linux平台,得到的随机序列100%一致。你给出的测试脚本在所有11+版本的PostgreSQL环境中,都会得到你贴出的id与code对应结果,不会出现跨平台数据差异。 - PostgreSQL 10及更早版本:和旧文档描述一致,
random()底层直接调用操作系统提供的drand48()或同类随机函数,不同操作系统的这类函数实现逻辑存在差异,即便设置相同的seed也会生成完全不同的随机序列,你的脚本在不同系统上运行会得到不一样的插入数据。
适配建议
如果你的团队所有开发、集成环境都已经统一使用PostgreSQL 11及以上版本,现有脚本逻辑不需要做任何修改,跨平台可复现性完全有保障。如果仍有环境使用10及更早版本,可选择两种方案解决一致性问题:
- 统一升级所有环境的PostgreSQL到11+版本
- 替换
random()实现,改用不依赖系统底层的随机数生成逻辑,比如pgcrypto模块提供的随机函数
内容的提问来源于stack exchange,提问作者The Impaler
相关产品推荐
相关产品推荐

