//
//Java版
//
public static String getHash(String input_str){
int hash = 0;
int x = 0;
int i=0;
while(i<input_str.length())
{
hash=(hash<<4)+(input_str.charAt(i));
if((x=hash&0xF0000000)!=0){
hash^=(x>>24);
hash&=~x;
}
i++;
}
hash=hash&0x7FFFFFFF;
return String.format("%08X", hash);
}
//
//C#版
//
private String getHash(String input_str)
{UInt32 hash = 0;
UInt32 x = 0;
int i = 0;
byte[] b = System.Text.Encoding.ASCII.GetBytes(input_str);
while (i < input_str.Length)
{
hash = (hash << 4) + (UInt32)b[i];
if ((x = hash & 0xF0000000) != 0)
{
hash ^= (x >> 24);
hash &= ~x;
}
i++;
}
hash = hash & 0x7FFFFFFF;
return hash.ToString("%08X");
}
Java版移植C#版修改过程中的一些变化:
(1)
转换的时候C#我没找到String能够直接和整型相加的办法,所以只好用System.Text.Encoding.ASCII.GetBytes将String类型转换成ASCII码数组后,再通过强制类型转换(UInt32)b[i];取代Java的(input_str.charAt(i));取逐个字符。
(2)
0xF0000000在C#里默认为UInt32,只好把hash和x都定义为UInt32,否则类型会不一致。
(3)
Java求字符串长度用string.length(),而C#为string.Length
(4)
Java的String.format("%08X", hash);对应C#的String.Format("%08x", hash);结果不对,改用hash.ToString("%08X");结果看起来才正常。