c - postgres 使用什么哈希算法/函数进行 PARTITION BY HASH

标签 c postgresql

在postgres中,有一个基于hash的分区。但是 postgres 没有清楚地解释如何计算给定列值的哈希值。

我搜索了 Postgres 文档,但一无所获。除了在一些邮箱帖子中,有些人提到了 hashtext() 内部函数。有谁有关于用于散列值的实际函数(以及进一步使用模数运算符)的任何信息吗?我的意思是 postgres 如何对一个值进行哈希处理,将其转换为 uint64 以进行最终的模运算。

更新: 阅读 postgres 源代码,我发现分区函数在尝试查找给定散列的 uint64 值时使用这样的方法:

/*
 * DatumGetUInt64
 *      Returns 64-bit unsigned integer value of a datum.
 *
 * Note: this macro hides whether int64 is pass by value or by reference.
 */

#ifdef USE_FLOAT8_BYVAL
#define DatumGetUInt64(X) ((uint64) (X))
#else
#define DatumGetUInt64(X) (* ((uint64 *) DatumGetPointer(X)))
#endif

最佳答案

所使用的哈希函数是哈希索引运算符系列的支持函数。您可以在 pg_amproc 中找到它们系统目录;与 pg_opfamily 连接,并将查询限制为 hash 访问方法的运算符系列

此查询列出了每种类型的标准哈希支持函数:

SELECT DISTINCT
       ap.amproclefttype::regtype AS data_type,
       ap.amproc::regproc AS hash_function
FROM pg_amproc AS ap
   JOIN pg_opfamily AS of ON ap.amprocfamily = of.oid
   JOIN pg_am ON of.opfmethod = pg_am.oid
WHERE pg_am.amname = 'hash'
  AND ap.amprocnum = 1
ORDER BY amproclefttype::regtype::text;

这个功能应该是无关紧要的,但我理解你的好奇心。

请注意,除非您将分区放在不同的存储上以分散 I/O 负载,否则哈希分区几乎没有任何用处。

关于c - postgres 使用什么哈希算法/函数进行 PARTITION BY HASH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64647956/

相关文章:

c++ - 指向指针 : managing strings for different languages 的指针数组

android - Android图像原像处理中的C Jni错误

c - 我如何创建一个与 C 游戏同时工作的计时器?

ruby-on-rails - 具有多个外键和数据库约束的 Rails 多态关联

postgresql - "must be member of role"尝试设置一个用户对另一用户对象的访问权限时出现错误

postgresql - 将线串转换为点数组?

postgresql - 从一个表中复制值并将其插入到另一个 jsonb 字段

C程序,反转数组

c - 处理在 C 中作为参数传递的指针的函数返回值

postgresql - Union-all postgresql select 子句保留顺序