jsonb
不保留空格,不保留对象键的顺序,也不保留重复的对象键。如果在输入中指定了重复的键,则仅保留最后一个值。
我有一jsonb
列包含一些数据。我提取特定的关键数据(也是 json)并使用 sha256 对其进行哈希处理,如下所示:
SELECT sha256(to_jsonb(rule_element) :: TEXT :: BYTEA);
rule_element
从原始数据中提取的。鉴于它不维护键的顺序,并且原始列jsonb
将来可能会更新,我认为计算哈希值并不安全,因为它们可能会发生变化。
我可以计算jsonb
列的一致哈希值吗?(99%的人肯定不能,1%的人希望让我的工作更轻松)
哈希值将用于唯一标识目的,基本上充当不同类型 JSON 组合的唯一键。
没有官方保证 的实现(和文本表示)
jsonb
不会改变,所以如果我处理 50 年后将使用的数据,我不会依赖这种哈希的稳定性。但是,如果 的磁盘表示发生
jsonb
更改,则该版本将破坏 的升级pg_upgrade
,因此不太可能很快发生。字符串表示形式当然可以更改,但我想不出更改它的理由,除非磁盘上的表示形式发生jsonb
更改。如果您想在唯一约束中使用哈希,您可以在 上创建唯一约束
jsonb_hash_extended(jsoncol, 0)
。只要您仅以在转储/恢复期间哈希值发生变化就不会中断的方式存储哈希值。我觉得使用这些哈希值作为数据库外部的不可变标识符是不安全的。但也许我太担心了:如果结果
jsonb_hash_extended()
在不同的 PostgreSQL 版本中发生变化,那么哈希分区在jsonb
升级过程中就会中断。所以也许我们永远无法改变这一点。