我对这段代码并不了解。哈希

时间:2011-12-01 16:44:12

标签: c# hash

我对以下代码中的内容并不了解。为什么长度设置为16? ret变量的目的是什么?

请解释。

我不明白这一点:

    foreach (byte a in hash)
    {
        if (a < 16)
            ret += "0" + a.ToString("x");
        else
            ret += a.ToString("x");
    }

6 个答案:

答案 0 :(得分:6)

if (a < 16) 
    ret += "0" + a.ToString("x"); 
else 
    ret += a.ToString("x"); 

是一种更糟糕的写作方式

ret += a.ToString("x2");

它的目的是生成一个长度恰好为2的字符串,它是数字a的十六进制形式。由于十六进制只有一位数就可以达到15,因此代码显示“如果它适合一位数,则手动在前面加零”。

答案 1 :(得分:6)

此代码将十六进制的哈希码作为字符串获取,每个字节表示为一个2位十六进制值 - 您可以将其缩短为:

foreach (byte b in hashValue)
   ret +=b.ToString("X2");

或更好地使用StringBuilder代替:

StringBuilder strHash = new StringBuilder();
foreach (byte b in hashValue)
    strHash.Append(b.ToString("X2"));
ret = strHash.ToString();

或使用Linq更优雅(但引入一些开销):

ret = string.Join("",hashValue.Select(b => b.ToString("X2")));

答案 2 :(得分:4)

只是将结果作为十六进制值返回。如果a> = 16,那么十六进制值将是两个字符长(例如:A0)。如果a&lt; 16,十六进制值将是一个字符长(例如:A),所以用额外的0(=&gt; 0A)填充。

答案 3 :(得分:3)

十六进制是16的基数,因此0123456789代替0123456789ABCDEF作为可用数字而不是{{1}}。十六进制输出中的每个字节由2位数(16×16 = 256)表示以避免歧义,因此&lt; 16检查确保ToString将输出正确数量的字符。

答案 4 :(得分:1)

它将字节值转换为其十六进制值的2个字符的字符串表示形式。对于值&lt; 16它会输出一个字符。这不是一个非常干净的方式,因此混乱。

答案 5 :(得分:1)

ret是函数中的ret值。