diff options
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/nio/ByteBuffer.java | 20 | ||||
-rw-r--r-- | libjava/java/nio/CharBuffer.java | 18 | ||||
-rw-r--r-- | libjava/java/nio/DoubleBuffer.java | 20 | ||||
-rw-r--r-- | libjava/java/nio/FloatBuffer.java | 20 | ||||
-rw-r--r-- | libjava/java/nio/IntBuffer.java | 20 | ||||
-rw-r--r-- | libjava/java/nio/LongBuffer.java | 20 | ||||
-rw-r--r-- | libjava/java/nio/ShortBuffer.java | 20 |
7 files changed, 124 insertions, 14 deletions
diff --git a/libjava/java/nio/ByteBuffer.java b/libjava/java/nio/ByteBuffer.java index 378e588..e502e00 100644 --- a/libjava/java/nio/ByteBuffer.java +++ b/libjava/java/nio/ByteBuffer.java @@ -260,11 +260,27 @@ public abstract class ByteBuffer extends Buffer /** * Calculates a hash code for this buffer. + * + * This is done with <code>int</code> arithmetic, + * where ** represents exponentiation, by this formula:<br> + * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... + + * (s[limit()-1]+30)*31**(limit()-1)</code>. + * Where s is the buffer data. Note that the hashcode is dependent + * on buffer content, and therefore is not useful if the buffer + * content may change. + * + * @return the hash code */ public int hashCode () { - // FIXME: Check what SUN calculates here. - return super.hashCode (); + int hashCode = get(position()) + 31; + int multiplier = 1; + for (int i = position() + 1; i < limit(); ++i) + { + multiplier *= 31; + hashCode += (get(i) + 30)*multiplier; + } + return hashCode; } /** diff --git a/libjava/java/nio/CharBuffer.java b/libjava/java/nio/CharBuffer.java index 4ef257b..700c567 100644 --- a/libjava/java/nio/CharBuffer.java +++ b/libjava/java/nio/CharBuffer.java @@ -297,11 +297,25 @@ public abstract class CharBuffer extends Buffer /** * Calculates a hash code for this buffer. + * + * This is done with int arithmetic, + * where ** represents exponentiation, by this formula:<br> + * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... + + * (s[limit()-1]+30)*31**(limit()-1)</code>. + * Where s is the buffer data. Note that the hashcode is dependent + * on buffer content, and therefore is not useful if the buffer + * content may change. */ public int hashCode () { - // FIXME: Check what SUN calculates here. - return super.hashCode (); + int hashCode = get(position()) + 31; + int multiplier = 1; + for (int i = position() + 1; i < limit(); ++i) + { + multiplier *= 31; + hashCode += (get(i) + 30)*multiplier; + } + return hashCode; } /** diff --git a/libjava/java/nio/DoubleBuffer.java b/libjava/java/nio/DoubleBuffer.java index 10055cd..dd16ee0 100644 --- a/libjava/java/nio/DoubleBuffer.java +++ b/libjava/java/nio/DoubleBuffer.java @@ -243,11 +243,27 @@ public abstract class DoubleBuffer extends Buffer /** * Calculates a hash code for this buffer. + * + * This is done with <code>long</code> arithmetic, + * where ** represents exponentiation, by this formula:<br> + * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... + + * (s[limit()-1]+30)*31**(limit()-1)</code>. + * Where s is the buffer data, in Double.doubleToLongBits() form + * Note that the hashcode is dependent on buffer content, + * and therefore is not useful if the buffer content may change. + * + * @return the hash code (casted to int) */ public int hashCode () { - // FIXME: Check what SUN calculates here. - return super.hashCode (); + long hashCode = Double.doubleToLongBits(get(position())) + 31; + long multiplier = 1; + for (int i = position() + 1; i < limit(); ++i) + { + multiplier *= 31; + hashCode += (Double.doubleToLongBits(get(i)) + 30)*multiplier; + } + return ((int)hashCode); } /** diff --git a/libjava/java/nio/FloatBuffer.java b/libjava/java/nio/FloatBuffer.java index 6d19503..2ead8cb 100644 --- a/libjava/java/nio/FloatBuffer.java +++ b/libjava/java/nio/FloatBuffer.java @@ -243,11 +243,27 @@ public abstract class FloatBuffer extends Buffer /** * Calculates a hash code for this buffer. + * + * This is done with <code>int</code> arithmetic, + * where ** represents exponentiation, by this formula:<br> + * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... + + * (s[limit()-1]+30)*31**(limit()-1)</code>. + * Where s is the buffer data, in Float.floatToIntBits() form + * Note that the hashcode is dependent on buffer content, + * and therefore is not useful if the buffer content may change. + * + * @return the hash code */ public int hashCode () { - // FIXME: Check what SUN calculates here. - return super.hashCode (); + int hashCode = Float.floatToIntBits(get(position())) + 31; + int multiplier = 1; + for (int i = position() + 1; i < limit(); ++i) + { + multiplier *= 31; + hashCode += (Float.floatToIntBits(get(i)) + 30)*multiplier; + } + return hashCode; } /** diff --git a/libjava/java/nio/IntBuffer.java b/libjava/java/nio/IntBuffer.java index 68a71db..814e041 100644 --- a/libjava/java/nio/IntBuffer.java +++ b/libjava/java/nio/IntBuffer.java @@ -243,11 +243,27 @@ public abstract class IntBuffer extends Buffer /** * Calculates a hash code for this buffer. + * + * This is done with <code>int</code> arithmetic, + * where ** represents exponentiation, by this formula:<br> + * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... + + * (s[limit()-1]+30)*31**(limit()-1)</code>. + * Where s is the buffer data. Note that the hashcode is dependent + * on buffer content, and therefore is not useful if the buffer + * content may change. + * + * @return the hash code */ public int hashCode () { - // FIXME: Check what SUN calculates here. - return super.hashCode (); + int hashCode = get(position()) + 31; + int multiplier = 1; + for (int i = position() + 1; i < limit(); ++i) + { + multiplier *= 31; + hashCode += (get(i) + 30)*multiplier; + } + return hashCode; } /** diff --git a/libjava/java/nio/LongBuffer.java b/libjava/java/nio/LongBuffer.java index c4066b1..6e9ef34 100644 --- a/libjava/java/nio/LongBuffer.java +++ b/libjava/java/nio/LongBuffer.java @@ -243,11 +243,27 @@ public abstract class LongBuffer extends Buffer /** * Calculates a hash code for this buffer. + * + * This is done with <code>long</code> arithmetic, + * where ** represents exponentiation, by this formula:<br> + * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... + + * (s[limit()-1]+30)*31**(limit()-1)</code>. + * Where s is the buffer data. Note that the hashcode is dependent + * on buffer content, and therefore is not useful if the buffer + * content may change. + * + * @return the hash code (casted to int) */ public int hashCode () { - // FIXME: Check what SUN calculates here. - return super.hashCode (); + long hashCode = get(position()) + 31; + long multiplier = 1; + for (int i = position() + 1; i < limit(); ++i) + { + multiplier *= 31; + hashCode += (get(i) + 30)*multiplier; + } + return ((int)hashCode); } /** diff --git a/libjava/java/nio/ShortBuffer.java b/libjava/java/nio/ShortBuffer.java index 0830391..db03076 100644 --- a/libjava/java/nio/ShortBuffer.java +++ b/libjava/java/nio/ShortBuffer.java @@ -243,11 +243,27 @@ public abstract class ShortBuffer extends Buffer /** * Calculates a hash code for this buffer. + * + * This is done with <code>int</code> arithmetic, + * where ** represents exponentiation, by this formula:<br> + * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... + + * (s[limit()-1]+30)*31**(limit()-1)</code>. + * Where s is the buffer data. Note that the hashcode is dependent + * on buffer content, and therefore is not useful if the buffer + * content may change. + * + * @return the hash code */ public int hashCode () { - // FIXME: Check what SUN calculates here. - return super.hashCode (); + int hashCode = get(position()) + 31; + int multiplier = 1; + for (int i = position() + 1; i < limit(); ++i) + { + multiplier *= 31; + hashCode += (get(i) + 30)*multiplier; + } + return hashCode; } /** |