我需要哈希函数总是返回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;
}
答案 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;
}