【问题标题】:What is the best way to check for duplicate TEXT fields in MYSQL/PHP?在 MYSQL/PHP 中检查重复 TEXT 字段的最佳方法是什么?
【发布时间】:2011-06-21 14:37:26
【问题描述】:

我的代码提取了大约 1000 个 HTML 文件,提取了相关信息,然后将这些信息存储在 MySQL TEXT 字段中(因为它通常很长)。我正在寻找一个系统来防止数据库中的重复条目

我的第一个想法是在表中添加一个 HASH 字段(可能是 MD5),在每次运行开始时提取哈希列表并在插入数据库之前检查重复项。

第二个想法是存储文件长度(字节或字符或其他),对其进行索引,并检查重复的文件长度,如果发现重复的长度,则再次检查内容。

不知道什么是性能方面的最佳解决方案。也许有更好的方法?

如果有一种有效的方法来检查文件是否 >95% 相似,那将是理想的,但我怀疑是否存在?

感谢您的帮助!

顺便说一句,我正在使用 PHP5/Kohana


编辑:

刚刚有了一个检查相似性的想法:我可以计算所有字母数字字符并记录每个字符的出现

例如:17aB... = 1a,7b,10c,27c,...

潜在问题是字符数的上限(大约 61 个?)

我想误报仍然很少见。 . .

好主意/坏主意?

【问题讨论】:

  • 哈希的冲突比计算字母数字的出​​现次数要少。如果您想要一个更抗冲突的哈希,请使用 sha1。不要浪费时间重新发明一个更糟糕的系统。
  • 是的,这就是我最终决定的

标签: php mysql hash duplicates


【解决方案1】:

哈希的想法可能是最好的。您可能会遇到碰撞,但它们会非常罕见。

使哈希字段成为表的唯一键,并捕获重复的错误代码。或使用insert ignoreinsert replace

【讨论】:

    【解决方案2】:

    听起来不错,我已经实现了类似的东西。哈希字段应该是一个键,因为不允许重复。

    如果每条文本记录都很长,您可以计算每条记录的固定倍数(比如 2)哈希值。那么也许如果其中只有一个是相同的,那就足够接近了。显然,每条记录的哈希值越多,就越接近于比较全文。

    MD5 是 16 个字节。随着时间的推移,会有多少潜在的哈希值?如果这个数字保持合理,你应该可以在内存中进行比较。

    【讨论】:

    • 在任何时候都不会有超过 100,000 个活动条目。不能将哈希用作 Kohana 的 ORM 限制的密钥 b/c。可能会按照布赖恩的建议使用insert replace
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2011-03-28
    • 2015-04-08
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多