【发布时间】:2019-08-08 21:08:00
【问题描述】:
假设我有大量文档以某种方式散列(例如 Sha256)并存储它们的散列。是否有一种散列技术可以让我通过查看它们的散列来检查string1 是否包含在string2 中?我想避免加载全文。
澄清一下:这与 sim/min-hashing、寻找近似重复或 Levenshtein 距离无关。我正在寻找一种散列算法,它可以让我通过查看散列来检查子字符串。
例如
var string1 = "bla bla bla cat dog bla bla";
var string2 = "cat dog";
var hash1 = HashAlgo(string1); // <-- magic goes here
var hash2 = HashAlgo(string2);
Assert.IsTrue(string1.Contains(string2));
Assert.IsTrue(hash1.Contains(hash2)); // <--- magic goes here
【问题讨论】:
-
如果不扩展“哈希”的定义,我不确定这是否可行。据我所知,散列是一个有损的过程。
-
我想这是不可能的。如果可能,这可能是一个巨大的安全风险
-
堆积到最后两个 cmets。这是不可能的,也不应该是可能的。任何允许这种事情发生的散列都是一个安全漏洞,并且与“散列”的整个概念背道而驰。想象一下用这种“魔法”散列值
a、ab、abc、abcd和abcde。每个散列都会包含前一个,基本上你最终得到的只是一些奇怪的翻译函数,而不是散列。 -
如果你散列行并且主散列是来自那些散列的 函数 具有(不知道这个术语)能够检查它包含你给出的任何散列的能力,那么您可以对任何行进行哈希处理以检查它是否存在。段落更好。最简单的主散列函数是字符串连接。注意:hash hit 不代表真的,它的意思是“也许”。
-
您需要索引而不是散列。建立所有文档中所有单词的索引。或者更好的是,使用为您执行此操作的数据库。谷歌搜索“全文索引”。