1

我需要哈希函数始终返回 64 char hex,但有时,根据文件,它返回 63,这对我来说是个问题。由于业务原因,我总是需要 64 个字符。这完全随机发生在任何类型和大小的文件中。有谁知道为什么会这样?按照我的代码:

public static String geraHash(File f) throws NoSuchAlgorithmException, FileNotFoundException  
{  
    MessageDigest digest = MessageDigest.getInstance("SHA-256");  
    InputStream is = new FileInputStream(f);  
    byte[] buffer = new byte[8192];  
    int read = 0;  
    String output = null;  
    try  
    {  
        while( (read = is.read(buffer)) > 0)  
        {  
            digest.update(buffer, 0, read);  
        }  
        byte[] md5sum = digest.digest();  
        BigInteger bigInt = new BigInteger(1,md5sum);
        output = bigInt.toString(16);  
    }  
    catch(IOException e)  
    {  
        throw new RuntimeException("Não foi possivel processar o arquivo.", e);  
    }  
    finally  
    {  
        try  
        {  
            is.close();  
        }  
        catch(IOException e)  
        {  
            throw new RuntimeException("Não foi possivel fechar o arquivo", e);  
        }  
    }  

    return output;  
}  
4

1 回答 1

0

事实上,有 32 个字节。第一个字节的前半部分为零。(第一个字节看起来像0000 xxxx:)

因此,当您将其转换为字符串时,它有 63 个十六进制值,即 31.5 个字节,因此它是 32 个字节。这(32 字节)正是它应该是的。

当它的长度为 63 时,您可以只写0字符串的开头。

if (output.length == 63){
    output = "0" + output;
}

或者

while (output.length < 64){
    output = "0" + output;
}
于 2013-09-09T13:31:56.953 回答