我正在生成几个文件的SHA256哈希值,其中一些返回63个字符而不是64个字符。怎么可能?

时间:2013-09-09 13:23:53

标签: java sha256

我需要哈希函数总是返回64个字符的十六进制,但有时,根据文件,它返回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;  
}  

1 个答案:

答案 0 :(得分: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;
}