1 57 58 package org.enhydra.apache.xerces.utils; 59 60 64 65 public final class Hash2intTable { 66 67 68 private static final int INITIAL_BUCKET_SIZE = 4; 69 private static final int HASHTABLE_SIZE = 256; 70 private int[][] fHashTable = new int[HASHTABLE_SIZE][]; 71 72 73 public void put(int key1, int key2, int key3, int value) { 74 int hash = (key1+key2+key3+2) % HASHTABLE_SIZE; 75 int[] bucket = fHashTable[hash]; 76 77 if (bucket == null) { 78 bucket = new int[1 + 4*INITIAL_BUCKET_SIZE]; 79 bucket[0] = 1; 80 bucket[1] = key1; 81 bucket[2] = key2; 82 bucket[3] = key3; 83 bucket[4] = value; 84 fHashTable[hash] = bucket; 85 } else { 86 int count = bucket[0]; 87 int offset = 1 + 4*count; 88 if (offset == bucket.length) { 89 int newSize = count + INITIAL_BUCKET_SIZE; 90 int[] newBucket = new int[1 + 4*newSize]; 91 System.arraycopy(bucket, 0, newBucket, 0, offset); 92 bucket = newBucket; 93 fHashTable[hash] = bucket; 94 } 95 boolean found = false; 96 int j=1; 97 for (int i=0; i<count; i++){ 98 if ( bucket[j] == key1 && bucket[j+1] == key2 99 && bucket[j+2] == key3 ) { 100 bucket[j+3] = value; 101 found = true; 102 break; 103 } 104 j += 4; 105 } 106 if (! found) { 107 bucket[offset++] = key1; 108 bucket[offset++] = key2; 109 bucket[offset++] = key3; 110 bucket[offset]= value; 111 bucket[0] = ++count; 112 } 113 114 } 115 } 116 117 public int get(int key1, int key2, int key3) { 118 int hash = (key1+key2+key3+2) % HASHTABLE_SIZE; 119 int[] bucket = fHashTable[hash]; 120 121 if (bucket == null) { 122 return -1; 123 } 124 int count = bucket[0]; 125 126 int j=1; 127 for (int i=0; i<count; i++){ 128 if ( bucket[j] == key1 && bucket[j+1] == key2 129 && bucket[j+2] == key3) { 130 return bucket[j+3]; 131 } 132 j += 4; 133 } 134 return -1; 135 } 136 137 } 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | Popular Tags |