我将消息序列存储在数据库中,每个序列最多可以包含N
条消息。我想创建一个哈希函数来表示消息序列,并能够更快地检查消息序列是否存在。
每条消息都有区分大小写的字母数字通用唯一ID(UUID)。 考虑跟随ID {-
的消息(M1, M2, M3)
M1 - a3RA0000000e0taBB
M2 - a3RA00033000e0taC
M3 - a3RA0787600e0taBB
消息序列可以是
Sequence-1 : (M1,M2,M3)
Sequence-2 : (M1,M3,M2)
Sequence-3 : (M2,M1,M3)
Sequence-4 : (M1,M2)
Sequence-5 : (M2,M3)
...等等...
以下是用于存储消息序列的数据库结构示例
鉴于消息序列,我们需要检查该消息序列是否存在于数据库中。例如,检查数据库中是否存在消息序列M1 -> M2 -> M3
,即UID为(a3RA0000000e0taBB -> a3RA00033000e0taC -> a3RA0787600e0taBB)
。
我想创建一个散列函数来代表带有散列值的消息序列,而不是扫描表中的行。据称,在表中使用哈希值查找会更快。
我想知道一种用于更快存储消息序列哈希的最佳哈希函数是存在检查。
答案 0 :(得分:4)
您不需要完整的加密哈希,而只需要一个快速的哈希,那么看看FastHash:https://github.com/ZilongTan/Coding/tree/master/fast-hash怎么样。如果您认为32位或64位哈希值不够用(即产生太多冲突),则可以使用更长的MurmurHash:https://en.wikipedia.org/wiki/MurmurHash(实际上,FastHash的作者建议使用此方法)
Wikipedia上还有更多算法列表:https://en.wikipedia.org/wiki/List_of_hash_functions#Non-cryptographic_hash_functions
无论如何,即使在现代机器上,使用位运算(SHIFT,XOR ...)的哈希也应比方法中的乘法更快。
答案 1 :(得分:2)
如何使用MD5 algorithm为messageUID的串联字符串生成哈希。
例如-考虑消息
M1 - a3RA0000000e0taBB
M2 - a3RA00033000e0taC
M3 - a3RA0787600e0taBB
对于消息序列M1->M2->M3
,字符串为a3RA0000000e0taBB;a3RA00033000e0taC;a3RA0787600e0taBB
,其MD5哈希为176B1CDE75EDFE1554888DAA863671C4
。
根据this answer,MD5可以抵御冲突。在给定的情况下,不需要安全性,因此MD5就足够了。
答案 2 :(得分:0)
任何常规的字符串哈希算法(例如,您选择的语言库字符串哈希)应用于消息的串联UUID,只要您通过该哈希选择所有消息并检查它们确实是正确的消息顺序就足够了。取决于通常一个序列中有多少消息(可能还要考虑最坏的情况),这可能有效,也可能无效。通常没有办法保证无冲突的哈希计算,因此您应该考虑发生冲突时将要做什么。 现在,如果要优化此设置以确保您的哈希是唯一的,则在某些情况下有可能。尝试插入数据后,您将了解碰撞问题,因此您可以对它进行一些处理(例如,对序列应用盐或虚拟消息,或类似的操作来修改哈希并继续进行处理,直到得到一个空位),但将需要足够大的哈希值,并可能需要其他针对应用的特定修改。
答案 3 :(得分:-1)
过早的优化是万恶之源。从您选择的语言中内置的哈希函数开始,然后对列表(M1, M2)
等进行哈希。然后对其进行概要分析并在开始使用第三方哈希库之前查看这是否是瓶颈。
我的猜测是,数据库查找的速度将比散列计算慢,因此使用哪个散列无关紧要。
在Python中,您可以调用
hash([m1, m2, m3])
在Java中,请在hashCode
上调用ArrayList
方法。