سؤال

وكيف يمكنني تحسين هذا الرمز؟ أنا جعلت IPFilter وأنا بحاجة لتحسين ذلك.

package com.ipfilter;

import java.util.HashMap;
import java.util.Map;

/**
 *      IPFilter
 * 
 *      Loads given IP addresses to memory, so you can  easily check if ip addres has been blocked
 */

public class IPFilter {
        private Map<Integer, IPFilter> filter = new HashMap<Integer, IPFilter>();

        /**
         * Convert String ip address to Integer array and then calls add ip method
         * @param ip
         * @return
         */
        public void addIP(String ip)
        {
                int[] numbers = convert(ip);
                addIP(numbers, 0);
        }

        /**
         * Convert String ip address to Integer array
         * @param ip
         * @return
         */
        private int[] convert(String ip) {
                String[] strings = ip.split("\\.");
                int[] numbers = new int[strings.length];
                for(int i = 0; i < strings.length; i++)
                {
                        numbers[i] = Integer.parseInt(strings[i]);
                }
                return numbers;
        }

        /**
         * Add ip address to memory
         * @param ip
         * @param level
         */
        private void addIP(int[] ip, int level) {
                if(level < ip.length)
                {
                        if (filter.containsKey(ip[level])) {
                                filter.get(ip[level]).addIP(ip, level + 1);
                        } else {
                                filter.put(ip[level], new IPFilter());
                                filter.get(ip[level]).addIP(ip, level + 1);
                        }
                }
        }

        /**
         * Checks if ip address is in filter
         * @param ip
         * @return
         */
        public boolean isBlocked(String ip)
        {
                return isBlocked(filter, convert(ip), 0);
        }

        /**
         * Check if ip address is blocked
         * @param list
         * @param ip
         * @param level
         * @return
         */
        private boolean isBlocked(Map<Integer, IPFilter> list, int[] ip, int level)
        {
                if(list.containsKey(ip[level]))
                {
                        if(level < ip.length - 1)
                        {
                                return isBlocked(list.get(ip[level]).getList(), ip, level + 1);
                        }
                        else
                        {
                                return true;
                        }
                }
                else
                {
                        return false;
                }
        }       

        /**
         * Getter for list
         * @return
         */
        protected Map<Integer, IPFilter> getList() {
                return filter;
        }
}
هل كانت مفيدة؟

المحلول

والشخصي من خلال بعض حالات الاستخدام النموذجية واستخدام هذه البيانات لمعرفة أين هي اختناقات الأداء. على THEN ، أو تحسين هذا الرمز.

ودون معرفة الواقع حيث مشكلة الأداء هو، هل يمكن أن تنفق الكثير من الوقت والجهد ميكروثانية الادخار.

نصائح أخرى

وأنا لست متأكدا بالضبط ما تحاول على الوجه الأمثل. ومع ذلك، لديك بضع containsKey تليها get. A الأمثل الممكن هو استخدام get ومقارنة null. على سبيل المثال، بدلا من:

 if (filter.containsKey(ip[level])) {
      filter.get(ip[level])
 }

والقيام بما يلي:

 IPFilter value = filter.get(ip[level]);
 if (value != null) {
      value.addIp(...);
 }

ولكن أعتقد أن أفضل نصيحة أستطيع أن أعطي لكم هو: استخدام التعريف. إذا كنت تستخدم الكسوف، تحقق TPTP .

لا لشيء، وإنما هو عنوان IP هو عدد صحيح 4 بايت كما انها عادة ما تنفذ. لماذا لا ترميز إلى ذلك، والسماح فقط:

int ipSrc = convertIpToInt(String ip); 
if ( ipSrc == ipDest ) { 
  /// 
} 

وتكون المقارنة.

ول IPv6، يمكنك استخدام استخدام فترة طويلة.

وبعد ذلك مرة أخرى، ما كنت على الارجح القيام به هو استخدام java.net.Inet4Address وتخزينها في مجموعة.

ومنذ كنت تستخدم خريطة، لماذا لا نحاول الخروج نهج التبسيط؟ ومن شأن تنفيذ الذكية في منتصف الطريق من Inet4Address.equals () القيام المقارنة صحيح، وليس مقارنة السلسلة.

وبالطبع هذه الطريقة ينهار إذا كنت تريد أن تفعل أحرف غير ...: - /

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top