Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SHA-512函数仅产生508位输出?_Java_String_Substring_Sha_Sha512 - Fatal编程技术网

Java SHA-512函数仅产生508位输出?

Java SHA-512函数仅产生508位输出?,java,string,substring,sha,sha512,Java,String,Substring,Sha,Sha512,我有一个循环和散列的数据点。我正在使用SHA-512的Java实现来散列数据。散列应该产生一个128个字符的字符串,但有时它会产生一个127个字符的字符串,这会导致我的代码出现越界异常 代码通常会在每计算20个不同的哈希值中产生一个不正确的长度哈希值1 这是我用来实现散列的代码,它来自 公共静态字符串SHA512(字符串输入) { 试试{ //使用算法SHA-512调用getInstance()方法 MessageDigest md=MessageDigest.getInstance(“SH

我有一个循环和散列的数据点。我正在使用SHA-512的Java实现来散列数据。散列应该产生一个128个字符的字符串,但有时它会产生一个127个字符的字符串,这会导致我的代码出现越界异常

代码通常会在每计算20个不同的哈希值中产生一个不正确的长度哈希值1

这是我用来实现散列的代码,它来自

公共静态字符串SHA512(字符串输入)
{ 
试试{
//使用算法SHA-512调用getInstance()方法
MessageDigest md=MessageDigest.getInstance(“SHA-512”);
//调用digest()方法
//计算输入字符串的消息摘要
//作为字节数组返回
byte[]messageDigest=md.digest(input.getBytes());
//将字节数组转换为符号表示
BigInteger否=新的BigInteger(1,messageDigest);
//将消息摘要转换为十六进制值
字符串hashtext=no.toString(16);
//添加前面的0使其成为32位
而(hashtext.length()<32){
hashtext=“0”+hashtext;
} 
//返回哈希文本
返回hashtext;
} 
//用于指定错误的消息摘要算法
catch(nosuchalgorithme){
抛出新的运行时异常(e);
} 
} 
下面是由上面列出的代码生成的正确长度(128个字符)的哈希: CA36F8A40A6211D49E77F84CA37182813FBA853FBA732E29D18414C739B85F856FD3AF702A2CD23174EEAEDF2D99A044B0AE0DDEA17DE7BB33E3B62CFEC5236

下面是由上面列出的代码生成的长度不正确(127个字符)的哈希:
d2d3cb7a7f60a0fd673c86fb82eb515c4f2f40f0308df7b3c838b78c510125967191ad9afe0e4f8e5fb59ed190bc6652d3e4805c886fc1e62213a3284cca661

将while循环条件从
<32
更改为
<128
将其修复。这是有意义的,因为代码应该生成128个十六进制数字字符串(512位),而不是32个十六进制数字字符串(128位)。似乎这可能是OP代码中列出的错误。

您正在将哈希转换为十六进制字符串。平均每十六个哈希中就有一个以二进制
0b0000
开头,这将在十六进制转换中给出前导零,就像每256个哈希中就有一个以
0b00000000
0x00
开头一样。检查十六进制转换是否没有去掉前导零。

IIRC,Java的MessageDigest不会填充。因此,您必须提供填充,否则将填充两位长度的全部功率。谢谢您的评论。填充哈希值的好方法是什么?我使用这段代码是为了区块链的目的,我不确定用0填充字符串的开头是否是个好主意,因为这正是我的区块链程序试图挖掘的。
public static String SHA512(String input) 
{ 
    try { 
        // getInstance() method is called with algorithm SHA-512 
        MessageDigest md = MessageDigest.getInstance("SHA-512"); 

        // digest() method is called 
        // to calculate message digest of the input string 
        // returned as array of byte 
        byte[] messageDigest = md.digest(input.getBytes()); 

        // Convert byte array into signum representation 
        BigInteger no = new BigInteger(1, messageDigest); 

        // Convert message digest into hex value 
        String hashtext = no.toString(16); 

        // Add preceding 0s to make it 32 bit 
        while (hashtext.length() < 32) { 
            hashtext = "0" + hashtext; 
        } 

        // return the HashText 
        return hashtext; 
    } 

    // For specifying wrong message digest algorithms 
    catch (NoSuchAlgorithmException e) { 
        throw new RuntimeException(e); 
    } 
}