在 PostgreSQL 中添加无符号 256 位整数

Oli*_*nde 6 postgresql pgcrypto cryptography

我想知道是否有任何方法可以在 PostgreSQL 中执行以下操作:

UPDATE cryptotable SET work = work + 'some big hexadecimal number'
Run Code Online (Sandbox Code Playgroud)

其中 work 是一个无符号的 256 位数字。现在我的列是一个字符变化(64)列(十六进制表示),但如果它让我执行上述操作,我很乐意切换到另一种数据类型。

如果 vanilla PostgreSQL 无法实现,是否有可以帮助我的扩展?

(我也将此发布到 pgsql-hackers,因此请查看那里的线程以获取更多想法。)

Oli*_*nde 6

我最终只是使用numeric建议的类型并在我的应用程序代码中进行十六进制/数字转换。


Eva*_*oll 5

使用 pg-bignum

pg-bignum库做你想要什么。我只是修补它以接受十六进制输入。

下载库。跑

make
sudo make install
Run Code Online (Sandbox Code Playgroud)

现在,运行

CREATE EXTENSION bignum;
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样取一个 256 位的数字

59 51 a1 20 2e 65 62 26 ab f3 af e6 93 16 db 1c 
3b 37 24 47 75 32 72 95 79 e9 d7 fa 38 12 c0 0e 
Run Code Online (Sandbox Code Playgroud)

并将其喂给bn_hex_in()

SELECT bn_in_hex('5951a1202e656226abf3afe69316db1c3b3724477532729579e9d7fa3812c00e');
                                   bn_in_hex                                   
-------------------------------------------------------------------------------
 40400070184923956455012790534029088594440775740385060328118871212830923866126
(1 row)
Run Code Online (Sandbox Code Playgroud)

您可以使用 Wolfram Alpha 确认

尺寸优势

数字非常大,来自文档

数字值物理存储,没有任何额外的前导或尾随零。因此,列的声明精度和小数位数是最大值,而不是固定分配。(在这个意义上,数字类型更类似于 varchar(n) 而不是 char(n)。)实际存储要求是每组四位十进制数字两个字节,加上三到八个字节的开销。

上面的数字示例是 46 个字节(您可以使用 来检查::text::numeric),作为一个 bignum,它是 36。