用例:客户端需要通过HTTP发送大量字符串。服务器回复该字符串是否包含某些子字符串。然而,巨大的字符串是巨大的。因此,该系统效率非常低。而且,巨大的字符串包含一些敏感信息,所以这真的很不安全。
是否有一些伪散列机制以某种方式将一个大字符串汇总成一个数字,这个大字符串的所有子字符串都会散列到相同的数字,但非子字符串很可能不会散列到这个大字符串?< / p>
答案 0 :(得分:8)
是否有一些伪散列机制以某种方式将一个大字符串汇总成一个数字,这个大字符串的所有子字符串都会散列到相同的数字,但非子字符串很可能不会散列到这个大字符串?< / p>
没有
让f
成为这样的哈希。考虑字符串s
和非子字符串t
。请注意,s
和t
是s + t
的子字符串。因此,s
和t
具有相同的哈希值(即f(s) = f(t) = f(s + t)
)。这与f(s) != f(t)
概率很高的要求相反。
特别是,对于s = ""
,我们发现所有字符串t
都有f(s) = f(t)
,因此f
是常量且等于f("")
。
答案 1 :(得分:2)
是否有一些伪散列机制以某种方式将一个大字符串汇总成一个数字,这个大字符串的所有子字符串都会散列到相同的数字,但非子字符串很可能不会散列到这个大字符串?< / p>
我想我必须解释为什么不会发生这种情况:
String string = "the quick brown fox jumps over the lazy dog";
这意味着,根据您的请求,此中的每个字母都将散列为相同的值。散列算法是确定性的。在此示例中,t -> 5
,h -> 5
,e -> 5
等等,但如果您有一些字符串:
String string2 = "hello there";
然后现在,您希望h
哈希到不同的东西,并且您希望e
哈希到不同的东西,所以给定完全相同的输入,您需要不同的值。这违背了数学函数的定义。
这是什么意思?
嗯,在你的函数中没有任何确定性方面,你的数据在值和被散列的字母之间没有可重复的映射,这意味着你的数据毫无意义。
答案 2 :(得分:1)
如果子串的长度恒定,则可以执行许多文件共享程序所执行的操作,并使用哈希列表或类似虎树哈希的内容。
哈希列表:为某个预设长度(例如64kB)的文件的每个块创建一个哈希值,然后传输这些哈希值的列表,以便验证这些块。
Tiger-Tree哈希:http://en.wikipedia.org/wiki/Merkle_tree#Tiger_tree_hash 基本上构建一个哈希的二叉树,叶子是哈希列表中的哈希值。
如果你需要匹配每个可能的子字符串而不仅仅是预定义的字符串,那么这不会起作用。
答案 3 :(得分:0)
所有子串听起来都不可行,但我想你可能对你尚未告诉我们的子串有一些限制。
如果您使用块对齐或空格对齐的子串,您可能会考虑使用布隆过滤器EG:https://pypi.python.org/pypi/drs-bloom-filter/1.01。布隆过滤器可以存储集合的成员并用于测试集合成员资格,有时每个元素只有一位。他们有时会给出误报,但用户可调整的假阳性概率。