任何破坏/散列字符串但可以匹配的算法?

时间:2013-06-02 21:18:40

标签: string algorithm hash

用例:客户端需要通过HTTP发送大量字符串。服务器回复该字符串是否包含某些子字符串。然而,巨大的字符串是巨大的。因此,该系统效率非常低。而且,巨大的字符串包含一些敏感信息,所以这真的很不安全。

是否有一些伪散列机制以某种方式将一个大字符串汇总成一个数字,这个大字符串的所有子字符串都会散列到相同的数字,但非子字符串很可能不会散列到这个大字符串?< / p>

4 个答案:

答案 0 :(得分:8)

  

是否有一些伪散列机制以某种方式将一个大字符串汇总成一个数字,这个大字符串的所有子字符串都会散列到相同的数字,但非子字符串很可能不会散列到这个大字符串?< / p>

没有

f成为这样的哈希。考虑字符串s和非子字符串t。请注意,sts + t的子字符串。因此,st具有相同的哈希值(即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 -> 5h -> 5e -> 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。布隆过滤器可以存储集合的成员并用于测试集合成员资格,有时每个元素只有一位。他们有时会给出误报,但用户可调整的假阳性概率。