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