我在数据库中存储消息序列,每个序列最多可以有 N
条消息。我想创建一个哈希函数来表示消息序列,并能够更快地检查消息序列是否存在。
每条消息都有一个区分大小写的字母数字通用唯一 ID (UUID)。
考虑以下消息 (M1, M2, M3)
with ids-
M1 - a3RA0000000e0taBB
M2 - a3RA00033000e0taC
M3 - a3RA0787600e0taBB
消息序列可以是
序列 1 : (M1,M2,M3)
序列 2 : (M1,M3,M2)
序列 3 : (M2,M1,M3)
序列 4 : (M1,M2)
序列 5 : (M2,M3)
……等……
以下是存储消息序列的数据库结构示例
给定消息序列,我们需要检查数据库中是否存在该消息序列。例如,检查消息序列 M1 -> M2 -> M3
即 UIDs (a3RA0000000e0taBB -> a3RA00033000e0taC -> a3RA0787600e0taBB)
是否存在于数据库中。
我不想扫描表中的行,而是想创建一个哈希函数来表示具有哈希值的消息序列。在表中使用散列值查找据说更快。
我想知道什么是用于存储消息序列哈希的最佳哈希函数,以便更快地进行是否存在检查。
最佳答案
您不需要成熟的加密散列,只需要一个快速散列,那么看看 FastHash 怎么样:https://github.com/ZilongTan/Coding/tree/master/fast-hash .如果您认为 32 位或 64 位哈希值不够(即产生太多冲突),那么您可以使用更长的 MurmurHash:https://en.wikipedia.org/wiki/MurmurHash (其实FastHash的作者推荐这种方式)
维基百科上有更多算法列表:https://en.wikipedia.org/wiki/List_of_hash_functions#Non-cryptographic_hash_functions
在任何情况下,使用位运算(SHIFT、XOR ...)的散列应该比您的方法中的乘法更快,即使在现代机器上也是如此。
关于algorithm - 唯一 ID 序列 (UUID) 的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51939047/