Самый быстрый способ проверить список IP-адресов сканеров через содержит в Java - PullRequest
2 голосов
/ 05 декабря 2010

Я получил список сканеров со следующего сайта: http://www.karavadra.net/blog/2010/list-of-crawlers-bots-and-their-ip-addresses/#respond

Если вы знаете лучший список IP-адресов, который регулярно обновляется, пожалуйста, дайте мне знать.

Теперь я создал объект:

 private static final HashSet<String> list = new HashSet<String>(){{
        add("66.249.71.248");
        add("66.249.66.38");
        add("66.249.65.142"); // 331 more entires
 }}; 

И я проверяю список с помощью этого метода:

public static boolean isCrawler(String ip){
  return list.contains(ip);  
}

Посоветуйте, пожалуйста, как улучшить это, чтобы было более быстрое и элегантное решение. Я использую весну, так что фасоль тоже подойдет.

Я бы хотел включить службу обновлений в список, но я не нашел пригодного для загрузки списка IP-адресов, который был бы полезен, и разбор веб-сайтов через Jsoup никогда не был идеальным решением.

Ответы [ 3 ]

2 голосов
/ 05 декабря 2010

Если я вас правильно понял, я бы хотел ускорить проверку вашего содержимого ().

Несмотря на то, что я считаю, что в любом случае, в случае с () HashSet работает нормально, я думаю, что в вашем случае вы можете немного его улучшить.IP-адрес на самом деле номер.Преобразуйте IP в число и поместите результат в набор.Надеюсь, это будет работать быстрее.

Вот как конвертировать IP в число:

public static Long ipToInt(String addr) {
        String[] addrArray = addr.split("\\.");

        long num = 0;
        for (int i=0;i<addrArray.length;i++) {
            int power = 3-i;

            num += ((Integer.parseInt(addrArray[i])%256 * Math.pow(256,power)));
        }
        return num;
    }

Я взял этот код у http://teneo.wordpress.com/2008/12/23/java-ip-address-to-integer-and-back/

0 голосов
/ 05 декабря 2010

Вы можете использовать фильтр Блума перед поиском в хэш-наборе. Это может привести к ошибкам. Фильтр Блума имеет проблему ложных + ve's. Так что для всех true фильтр Блума возвращает вас Вам придется еще раз взглянуть на хэш-набор, чтобы убедиться, что все ложные значения вы можете быть уверены. Также вы можете заменить свой хэш-набор radix tree / patricia trie для более компактного хранения.

Реализация:

0 голосов
/ 05 декабря 2010

Я думаю, что здесь не следует использовать хэши - 334 записи означают, что бинарный поиск в отсортированном списке займет log2 (334) = 8,3837 шагов, хеш-функция, вероятно, займет больше времени.

Используйте ArrayList и первоначально сортируйте его, используя Collections.sort(List list). Если вы хотите проверить IP, используйте Collections.binarySearch(List list, Object key) и проверьте, является ли возвращаемое значение> = 0 (что означает, что IP находится в списке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...