001: /*
002:
003: Derby - Class org.apache.derby.iapi.store.access.KeyHasher
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.iapi.store.access;
023:
024: import org.apache.derby.iapi.services.sanity.SanityManager;
025:
026: /**
027: Provides the ability to hash on multiple objects.
028: */
029: public class KeyHasher {
030:
031: private final Object[] objects;
032:
033: public KeyHasher(int size) {
034: objects = new Object[size];
035: }
036:
037: /**
038: * Set array element at the specified index to the specified object.
039: *
040: * @param index The specified index
041: * @param object The specified object.
042: */
043: public void setObject(int index, Object object) {
044: objects[index] = object;
045: }
046:
047: /**
048: * Get the object stored at the specified index.
049: *
050: * @param index The specified index.
051: *
052: * @return The object stored in the array element.
053: */
054: public Object getObject(int index) {
055: return objects[index];
056: }
057:
058: /**
059: * Static method to return the object to hash on.
060: * (Object stored in specifed array, if only a single
061: * object, otherwise a KeyHasher wrapping the
062: * objects to hash on.
063: * (NOTE: We optimize for in-memory hash tables, hence
064: * we only create a wrapper when needed.)
065: *
066: * @param objects The array of objects to consider
067: * @param indexes The indexes of the objects in the hash key.
068: *
069: * @return The object to hash on.
070: */
071: public static Object buildHashKey(Object[] objects, int[] indexes) {
072: // Hash on single object
073: if (indexes.length == 1) {
074: return objects[indexes[0]];
075: }
076:
077: // Hash on multiple objects
078: KeyHasher mh = new KeyHasher(indexes.length);
079: for (int index = 0; index < indexes.length; index++) {
080: mh.setObject(index, objects[indexes[index]]);
081: }
082: return mh;
083: }
084:
085: /*
086: ** Methods from java.lang.Object
087: */
088:
089: public int hashCode() {
090: int retval = 0;
091: for (int index = 0; index < objects.length; index++) {
092: retval += objects[index].hashCode();
093: }
094:
095: return retval;
096: }
097:
098: public boolean equals(Object obj) {
099: if (!(obj instanceof KeyHasher))
100: return false;
101:
102: KeyHasher mh = (KeyHasher) obj;
103:
104: if (mh.objects.length != objects.length)
105: return false;
106:
107: for (int index = 0; index < objects.length; index++) {
108: if (!(mh.objects[index].equals(objects[index]))) {
109: return false;
110: }
111: }
112:
113: return true;
114: }
115: }
|