package com.dbxml.db.core.data;

/*
 * dbXML - Native XML Database
 * Copyright (C) 1999-2004  The dbXML Group, L.L.C.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Id: Key.java,v 1.4 2004/02/12 00:17:57 bradford Exp $
 */

/**
 * Key extends Value by providing a hash value for the Key.
 */

public final class Key extends Value {
   private int hash;

   public Key(Value value) {
      super(value);
   }

   public Key(byte[] data) {
      super(data);
   }

   public Key(byte[] data, int pos, int len) {
      super(data, pos, len);
   }

   public Key(String data) {
      super(data);
   }

   public Key(String data, boolean utf8) {
      super(data, utf8);
   }

   /** @todo This has to be revisited */
   private void calculateHash() {
      hash = 0;
      int pl = pos + len;
      for ( int i = pos; i < pl; i++ ) {
         hash = (hash << 5) ^ data[i];
         hash = hash % 1234567891;
      }
      hash = Math.abs(hash);
   }

   public int getHash() {
      if ( hash == 0 )
         calculateHash();
      return hash;
   }

   public boolean equals(Value value) {
      if ( value instanceof Key ) {
         Key key = (Key)value;
         if ( getHash() == key.getHash() )
            return compareTo(key) == 0;
         else
            return false;
      }
      else
         return super.equals(value);
   }

   public int hashCode() {
      return getHash();
   }

   public boolean equals(Object obj) {
      if ( obj instanceof Key )
         return equals((Key)obj);
      else
         return super.equals(obj);
   }
}

