使用 MD5 哈希作为索引

Posted

技术标签:

【中文标题】使用 MD5 哈希作为索引【英文标题】:Using an MD5 Hash as an index 【发布时间】:2015-01-27 00:30:46 【问题描述】:

我正在编写一个包含一组特定数据的 MongoDB 集合,并且我想通过对数据进行 MD5(或者可能是 SHA256)哈希并以此为基础进行比较,从而针对该数据运行比较。

我想知道使用固定长度的十六进制数字字符串是否是正确的方法。是否有更好的数据类型可以使用,例如“blob”甚至 64 位长整数来保存值? (这可能需要我使用一个产生 long 的散列函数——我不知道有一个,除了可能用 Eclispe 覆盖 Java .hashCode() 函数?)

如果完全有更好的方法,请在此处提供最佳实践建议!

【问题讨论】:

我是否理解正确,您基本上是在为集合元素寻找合适的哈希函数? 是的——一旦找到散列函数,在 Mongo 中用来保存散列的最佳数据类型。由于哈希仅由 0-9A-F 组成,我认为字符串会过多吗? 我取决于你想用它来做什么。将二进制内容转储到 MongoDB 非常简单,因为它只是这样做,而且精确比较也不成问题。如果您不希望这是完全随机的并且需要某种排序,那么最好使用字符串。我认为这样做的目的是匹配字段“子集”中的内容,否则根本没有意义。对于具有唯一散列内容的整个文档,称为“主键”,它已经存在。 【参考方案1】:

在 MongoDB 中存储 MD5 哈希

如果您决定存储 MD5 哈希,则必须使用字符串或二进制(大小的一半)(请参阅here)。

最佳哈希函数

这很难回答,因为它在很大程度上取决于您集合中的数据类型。我个人认为 MD5 散列是一个好方法,但这又取决于用例。如果你想自定义/优化你的哈希,这个post 和这个post 可能会让你开始。它们涵盖了一些关于编写自定义哈希函数的简单方法。

【讨论】:

以上是关于使用 MD5 哈希作为索引的主要内容,如果未能解决你的问题,请参考以下文章

用于路径缓存的快速、无冲突哈希算法?

哈希索引

mysql在B-Tree上创建伪哈希索引

MongoDB 哈希索引

自适应哈希索引(Adaptive Hash Index, AHI) 转

mysql对于很长的字符列的索引方案