1 10 package org.jgap.util; 11 12 import java.math.*; 13 import java.util.*; 14 15 21 public class TestHashcode { 22 23 private static final String CVS_REVISION = "$Revision: 1.7 $"; 24 25 28 private boolean m_verbose; 29 30 36 private double m_AverageMin = 0.0d; 37 38 44 private double m_AverageMax = 1.0d; 45 46 52 private double m_StdDevMin = 1.0d; 53 54 60 private double m_StdDevMax = 2.0d; 61 62 68 private double m_fractionUnique = 0.9d; 69 70 74 private double m_actualFractionUnique = 0.0d; 75 76 83 public void setVerbose(boolean a_verbose) { 84 m_verbose = a_verbose; 85 } 86 87 94 public void setAverageMax(double a_averageMax) { 95 m_AverageMax = a_averageMax; 96 } 97 98 105 public void setAverageMin(double a_averageMin) { 106 m_AverageMin = a_averageMin; 107 } 108 109 118 public void setStdDevMax(double a_stdDevMax) { 119 m_StdDevMax = a_stdDevMax; 120 } 121 122 131 public void setStdDevMin(double a_stdDevMin) { 132 m_StdDevMin = a_stdDevMin; 133 } 134 135 145 public void setFractionUnique(double a_fractionUnique) { 146 if ( (a_fractionUnique < 0.0) || (a_fractionUnique > 1.0)) { 147 throw new IllegalArgumentException ( 148 "fractionUnique must be between 0.0 and 1.0"); 149 } 150 m_fractionUnique = a_fractionUnique; 151 } 152 153 public double getActualFractionUnique() { 154 return m_actualFractionUnique; 155 } 156 157 169 public boolean testHashCodeUniqueness(List a_ObjectList) { 170 boolean result = false; 171 int index; 172 int newvalue; 173 int numObjects = a_ObjectList.size(); 174 Hashtable hashCodes = new Hashtable(); 175 Integer key; 176 177 for (index = 0; index < numObjects; index++) { 178 int hashcode = a_ObjectList.get(index).hashCode(); 179 key = new Integer (hashcode); 180 if (hashCodes.containsKey(key)) { 181 newvalue = ( (Integer ) hashCodes.get(key)).intValue() + 1; 182 hashCodes.put(key, new Integer (newvalue)); 183 } 184 else { 185 hashCodes.put(key, new Integer (1)); 186 } 187 } 188 m_actualFractionUnique = ( (double) hashCodes.size() / (double) numObjects); 189 if (m_actualFractionUnique < m_fractionUnique) { 190 result = false; 191 } 192 else { 193 result = true; 194 } 195 return result; 196 } 197 198 207 public boolean testHashCodeEquality(List a_ObjectList) { 208 int index; 209 int hashCode; 210 long numObjects = a_ObjectList.size(); 211 212 if (numObjects < 2) { 213 return false; 214 } 215 hashCode = a_ObjectList.get(0).hashCode(); 216 for (index = 1; index < numObjects; index++) { 217 if (hashCode != a_ObjectList.get(index).hashCode()) { 218 return false; 219 } 220 } 221 return true; 222 } 223 224 239 public boolean testDispersion(List a_ObjectList) { 240 int index; 241 boolean result = false; 242 int[] hashCodes = new int[a_ObjectList.size()]; 243 long numObjects = a_ObjectList.size(); 244 double average = 0; 245 double stdDev; 246 double sumOfSquare; 247 double squareOfSum; 248 249 for (index = 0; index < numObjects; index++) { 250 hashCodes[index] = a_ObjectList.get(index).hashCode(); 251 } 252 253 for (index = 0; index < numObjects; index++) { 255 average += hashCodes[index]; 256 } 257 average /= numObjects; 258 259 sumOfSquare = 0; 261 squareOfSum = 0; 262 for (index = 0; index < numObjects; index++) { 263 sumOfSquare += (double) hashCodes[index] 264 * (double) hashCodes[index]; 265 squareOfSum += hashCodes[index]; 266 } 267 squareOfSum *= squareOfSum; 268 stdDev = (sumOfSquare * numObjects) - squareOfSum; 269 stdDev /= numObjects * (numObjects - 1); 270 stdDev = Math.sqrt(stdDev); 271 272 if (m_verbose) { 273 System.out.println("Average =" + average + " StdDev =" + stdDev); 274 System.out.println("Average - StdDev =" + (average - stdDev)); 275 System.out.println("Average + StdDev =" + (average + stdDev)); 276 } 277 278 if ( (m_AverageMin < average) && (average < m_AverageMax)) { 279 result = true; 280 } 281 else { 282 result = false; 283 } 284 285 if ( (m_StdDevMin < stdDev) && (stdDev < m_StdDevMax)) { 286 result &= true; 287 } 288 else { 289 result = false; 290 } 291 return result; 292 } 293 294 302 public static void main(String [] args) { 303 int com; 304 TestHashcode th = new TestHashcode(); 305 List tl = new ArrayList(); 306 307 for (com = 600000; com < 600100; com++) { 308 tl.add(new BigDecimal(com)); 309 } 310 th.testDispersion(tl); 311 th.setFractionUnique(0.8); 312 th.testHashCodeUniqueness(tl); 313 } 314 } 315 | Popular Tags |