实现用户名黑名单

时间:2011-03-01 01:23:49

标签: mysql

我有一个名单/单词的阻止列表,有大约500,000个条目。数据的使用是为了防止人们将这些单词作为用户名或名称输入。表结构很简单:word_id, word, create_date

当用户点击提交时,我希望系统查找输入的名称是完全匹配还是word%匹配。

这是实现阻止的唯一方法还是有更好的方法?我不喜欢在提交中查找这么多行的想法,因为它会减慢提交过程。

2 个答案:

答案 0 :(得分:1)

考虑几点:

  • 在您的应用程序中检查您的黑名单(业务逻辑),并在您的应用程序中执行比较。这就是它最属于的地方,你可能会有更丰富的编程语言来实现这种逻辑。

  • 将您的50万条记录加载到您的应用程序中,并将其存储在某种缓存中。在每次注册时,对缓存执行检查。这样可以避免在每次注册时碰到你的桌子。它将在您的应用程序中全部存储在内存中,并且性能更高。

  • 确保myEnteredUserName在开头,结尾以及介于两者之间的任何位置都没有列入黑名单的字词。您的问题专门有一个开始检查,但请确保您不会错过123_BadWord999

  • 缓存带来了一系列新的挑战;考虑每天n分钟或在特定时间或事件从数据库重新加载。这将允许加载新的列入黑名单的单词,并将旧的单词抛出。

答案 1 :(得分:0)

你不能where 'loginName' = word%。 %只能在文字字符串中使用,而不能作为列数据的一部分使用。

您需要说where 'logi' = word or 'login' = word or ...,其中您将登录名的子字符串与坏字进行比较。您需要测试每个子字符串,其长度介于最短和最长的坏字之间,包括在内。

确保您的表格word列上有索引,并查看效果如何。

其他方法是:

  • 使用Lucene,它擅长快速搜索文本,特别是如果您只需要知道您的子字符串是否存在。当然,Lucene在技术上可能不适合您的环境 - 它是一个Java库。
  • 记下每个坏词的哈希值,并将它们记录在内存中的bitset中 - 这样会很小而且快速查找,而且你只需要去数据库以确保它是正面的。 t false。