On Thu, Sep 20, 2012 at 7:56 PM, Haifeng Liu <liuhaif...@live.com> wrote:
> > On Sep 20, 2012, at 10:34 PM, Craig James <cja...@emolecules.com> wrote: > > > > On Thu, Sep 20, 2012 at 1:55 AM, Haifeng Liu <liuhaif...@live.com> wrote: > >> I want to write a hash function which acts as String.hashCode() in java: >> hash = hash * 31 + s.charAt(i)... but I got integer out of range error. How >> can I avoid this? I saw java do not care overflow of int, it just make the >> result negative. >> >> > Use the bitwise AND operator to mask the hash value with 0x3FFFFFF before > each iteration: > > hash = (hash & 67108863) * 31 + s.charAt(i); > > Craig > > > Thank you, I believe your solution is OK for a hash function, but I am > aiming to create a hash function that is consistent with the one > applications use. I know postgresql 9.1 has a hash function called > hashtext, but I don't know what algorithm it use, and I also see that it's > not recommended to relay on it. So I am trying to create a hash function > which behaves exactly the same as java.lang.String.hashCode(). The later > one may generate negative hash value. I guess when the number is > overflowing, the part out of range will be ignored, and if the highest bit > get 1, the hash value turn to negative value. > You are probably doing something where you want the application and the database to implement the exact same function, but if you stick to the Java built-in function, you will only have control over one implementation of that function. What happens if someone working on Java changes the how the Java internals work? A better solution would be to implement your own hash function in Postgres, and then once you know exactly how it will work, re-implement it in Java with your own code. That's the only way you can ensure consistency between the two. Craig