public final class ByteArrayWrapper
{
  private final byte[] contents;
  public ByteArrayWrapper(byte[] contents)
  {
    this.contents = contents;
  }

  public byte[] getContents()
  {
    return contents;
  }

  public int hashCode()
  {
    int result = 0;
    int pos = 0;
    for (int i=contents.length-1; i>=0; i--)
    {
      result += (contents[i] << pos);
      pos = (pos + 8) % 32; 
    }
    return result;
  }

  // this is 10x as slow as the other hashCode
  public int hashCodeSlow()
  {
    StringBuffer buf = new StringBuffer(contents.length*3);
    for (int i=contents.length-1; i>=0; i--)
    {
      buf.append(contents[i]);
    }
    return buf.toString().hashCode();
  }

  public boolean equals(Object obj)
  {
    try
    {
      ByteArrayWrapper other = (ByteArrayWrapper)obj;
      if (contents.length != other.contents.length) return false;
      for (int i=contents.length-1; i>=0; i--)
      {
        if (contents[i] != other.contents[i]) return false;
      }
      return true;
    }
    catch(NullPointerException ex)
    {
      return false;
    }
    catch(ClassCastException ex)
    {
      return false;
    }
  }

  public static void main(String[] args)
  {
    ByteArrayWrapper baw1 = new ByteArrayWrapper(
      new byte[] {1, 2, 3, 5, 1, 77, 125, 10, 11});
    ByteArrayWrapper baw2 = new ByteArrayWrapper(
      new byte[] {1, 2, 3, 5, 1, 77, 125, 10, 11});
    if (baw1.equals(baw2)) System.out.println("The two arrays are equal");
    if (baw2.equals(baw1)) System.out.println("The two arrays are equal");
    System.out.println("baw1.hashCode()=" + baw1.hashCode());
    System.out.println("baw2.hashCode()=" + baw2.hashCode());
    final int NUMBER_HASHCODE_TESTS = 100000;
    long start = System.currentTimeMillis();
    for (int i=0; i<NUMBER_HASHCODE_TESTS; i++)
    {
      baw1.hashCode();
    }
    System.out.println("It took " + (System.currentTimeMillis()-start) + 
      "ms to call hashCode " + NUMBER_HASHCODE_TESTS + " times");
  }
}

-----Original Message-----
From: Rickard �berg [mailto:[EMAIL PROTECTED]]
Sent: 11 August 2000 06:59
To: jBoss Developer
Subject: Re: [jBoss-Dev] [newbie] byte[].hashcode()


Hey

marc fleury wrote:
> did you know that
> 
> byte[] byte1 = {1,2,3};
> byte[] byte2 = {1,2,3};
> 
> yields
> byte1.equals(byte2) = false;
> and
> byte1.hashCode() != byte2.hashCode();

Of course.. since you are comparing the arrays, and not their contents.
Both equals and hashCode will be the Object defaults, which work on
memory adress of the actual object.

> blows my mind man....
> 
> what is the best way to compute a byte[].hashCode()?

Iterate and add the elements together. Also depends on the distribution
of the contents. Why do you need a byte array BTW? Is this for the Xid?
Why not use an enumerated long or something?

/Rickard

-- 
Rickard �berg

Email: [EMAIL PROTECTED]
http://www.telkel.com
http://www.jboss.org
http://www.dreambean.com

Reply via email to