C#版ELFhash

本文介绍了一个简单的哈希函数从Java移植到C#的过程,并详细对比了两种语言在实现过程中的差异,包括字符串处理、类型转换及输出格式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//

//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");结果看起来才正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值