java/src/org/openantivirus/util PatternOptimizer.java,1.2,1.3

Kurt Huwig <[email protected]> Thu, 20 May 2004 13:04:52 +0000
Newsgroups gmane.comp.security.virus.openantivirus.cvs
Message-ID <[email protected]>
Update of /cvsroot/openantivirus/java/src/org/openantivirus/util
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5503/src/org/openantivirus/util

Modified Files:
	PatternOptimizer.java 
Log Message:
Added multipart string finder
Speed improvements

Index: PatternOptimizer.java
===================================================================
RCS file: /cvsroot/openantivirus/java/src/org/openantivirus/util/PatternOptimizer.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- PatternOptimizer.java	19 May 2004 07:33:42 -0000	1.2
+++ PatternOptimizer.java	20 May 2004 13:04:49 -0000	1.3
@@ -17,7 +17,7 @@
  * The Original Code is OAV.
  *
  * The Initial Developer of the Original Code is Kurt Huwig <[email protected]>.
- * Portions created by the Initial Developer are Copyright (C) 2001-2003
+ * Portions created by the Initial Developer are Copyright (C) 2001-2004
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
@@ -27,6 +27,7 @@
 package org.openantivirus.util;
 
 import java.io.*;
+import java.util.*;
 
 import org.openantivirus.engine.credo.*;
 
@@ -46,18 +47,15 @@
         final int[] count = new int[1 << 16];
         final int[] used  = new int[1 << 16];
         
-        System.err.println("Zaehle...");
+        System.err.println("Counting...");
+        int match = is.read() & 0xff;
         int length;
-        is.read(buffer, 0, 1);
-        int triple = buffer[0] & 0xff;
         while ((length = is.read(buffer)) != -1) {
             
             for (int i = 0; i < length; i++) {
-                triple &= 0xff;
-                triple <<= 8;
-                triple |= buffer[i] & 0xff;
+                match = ((match << 8) | buffer[i]) & 0xffff;
                 
-                count[triple]++;
+                count[match]++;
             }
         }
         
@@ -66,52 +64,91 @@
         int optimized = 0, patterns = 0, hits = 0;
         
         final BufferedReader br = new BufferedReader(new FileReader(
-                "/home/kurt/Download/ClamAV/viruses.db"));
+                "/home/kurt/Download/ClamAV/viruses.db2"));
         String line;
         while ((line = br.readLine()) != null) {
             patterns++;
             
             final int equalPos = line.indexOf("=");
-            final String sPattern = line.substring(equalPos + 1);
-            final WildcardPattern wp = new WildcardPattern(sPattern);
-            
+            class PatternOffset {
+                public int offset;
+                public String pattern;
+                
+                public PatternOffset(int offset, String pattern) {
+                    this.offset = offset;
+                    this.pattern = pattern;
+                }
+            }
             
-            int min = Integer.MAX_VALUE;
-            int minPos = 0;
-            int pos = 0;
-            int minTriple = 0;
-            for (int j = 0; j < wp.skipList.length; j++) {
-                final int skipCount = wp.skipList[j];
+            final Collection patternOffsets = new LinkedList();
+            for (StringTokenizer st =
+                        new StringTokenizer(line.substring(equalPos + 1), "*");
+                 st.hasMoreTokens(); ) {
+                final String pattern = st.nextToken();
+                final WildcardPattern wp = new WildcardPattern(pattern);
                 
-                if (j % 2 == 0 && skipCount >= 2) {
-                    triple = wp.pattern[pos] & 0xff;
+                
+                int min = Integer.MAX_VALUE;
+                int minPos = 0;
+                int pos = 0;
+                int minTriple = 0;
+                for (int j = 0; j < wp.skipList.length; j++) {
+                    final int skipCount = wp.skipList[j];
                     
-                    for (int i = 1; i < skipCount; i++) {
-                        triple &= 0xff;
-                        triple <<= 8;
-                        triple |= wp.pattern[pos + i] & 0xff;
+                    if (j % 2 == 0 && skipCount >= 2) {
+                        match = wp.pattern[pos] & 0xff;
                         
-                        final int tripleCount = count[triple];
-                        if (tripleCount <= min) {
-                            min = tripleCount;
-                            minPos = pos + i;
-                            minTriple = triple;
+                        for (int i = 1; i < skipCount; i++) {
+                            match &= 0xff;
+                            match <<= 8;
+                            match |= wp.pattern[pos + i] & 0xff;
+                            
+                            final int tripleCount = count[match];
+                            if (tripleCount <= min) {
+                                min = tripleCount;
+                                minPos = pos + i;
+                                minTriple = match;
+                            }
                         }
                     }
+                    pos += skipCount;
                 }
-                pos += skipCount;
+                
+                if (min == 0) {
+                    optimized++;
+                } else {
+                    hits += min;
+                }
+                
+                patternOffsets.add(new PatternOffset(minPos, pattern));
+                
+                used[minTriple] += min;
             }
             
-            if (min == 0) {
-                optimized++;
-            } else {
-                hits += min;
+            System.out.print(line.substring(0, equalPos) + "[");
+            
+            boolean first = true;
+            for (Iterator it = patternOffsets.iterator(); it.hasNext(); ) {
+                if (first) {
+                    first = false;
+                } else {
+                    System.out.print('*');
+                }
+                System.out.print(((PatternOffset)it.next()).offset - 1);
             }
             
-            System.out.println(
-                    line.substring(0, equalPos) + "[" + (minPos - 1) + "]=" +
-                    sPattern);
-            used[minTriple] += min;
+            System.out.print("]=");
+            
+            first = true;
+            for (Iterator it = patternOffsets.iterator(); it.hasNext(); ) {
+                if (first) {
+                    first = false;
+                } else {
+                    System.out.print('*');
+                }
+                System.out.print(((PatternOffset)it.next()).pattern);
+            }
+            System.out.println();
         }
         br.close();
         



-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click