给定一个长度为 N 的string S,我们的任务是找到给定字符串 S 的 SHA-512 哈希值。
示例:
> 输入: S = "GeeksforGeeks"
> 输出: acc10c4e0b38617f59e88e49215e2e894afaee5ec948c2af6f44039f03c9fe47a9210e01d5cd926c142bdc9179c2ad30f927a8faf69421ff60a5eaddcf8cb9c
>
>
>
> 输入: S = "hello world"
> 输出:
> 309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f
方法: 让我们按照以下步骤来解决这个问题:
- 将给定字符串转换为二进制形式。
- 在字符串后追加 ‘1‘,然后不断追加 ‘0‘,直到字符串的长度满足 < (N%(1024 – 128)) 的条件。
- 在字符串 S 中添加 N 的 128位 二进制表示。
- 计算大小为 1024 的块的数目,并将其存储在变量 chunks 中,即 N/1024。
- 将string S 划分为 16 个块,每个块包含 64 个字符。
- 通过执行以下操作将块的数量扩展到 80 个:
- 遍历范围 [16, 80],然后找到 4 个值,即 WordA, WordB, WordC, WordD,如下所示:
- WordA = rotateright(Message[g – 2], 19) ^ rotateright(Message[g – 2], 61) ^ shift_right(Message[g – 2], 6)。
- WordB = Message[g – 7]。
- WordC = rotateright(Message[g – 15], 1) ^ rotateright(Message[g – 15], 8) ^ shift_right(Message[g – 15], 7)。
- WordD = Message[g – 16]。
- 将 Message[g] 的值更新为 (WordA + WordB + WordC + WordD)。
- 初始化 8 个变量,分别为 A, B, C, D, E, F, G, H,类型为 64位,用于存储给定字符串 S 的最终哈希值。
- 遍历数组 Block[] 并执行以下步骤:
- 通过逐一旋转,使用哈希函数更新 A, B, C, D, E, F, G, H 的值,共进行 80 次迭代。
- 现在,通过将 A, B, C, D, E, F, G, H 的先前值与新更新的值相加,来更新 A, B, C, D, E, F, G, H 的值。
- 完成上述步骤后,打印 A, B, C, D, E, F, G, H 的十六进制值,即可获得给定字符串的哈希值。
下面是上述方法的实现:
Java
`
import java.math.BigInteger;
public class Main {
static final BigInteger[] Constants = {
new BigInteger("428a2f98d728ae22", 16), new BigInteger("7137449123ef65cd", 16), new BigInteger("b5c0fbcfec4d3b2f", 16),
new BigInteger("e9b5dba58189dbbc", 16), new BigInteger("3956c25bf348b538", 16), new BigInteger("59f111f1b605d019", 16),
new BigInteger("923f82a4af194f9b", 16), new BigInteger("ab1c5ed5da6d8118", 16), new BigInteger("d807aa98a3030242", 16),
new BigInteger("12835b0145706fbe", 16), new BigInteger("243185be4ee4b28c", 16), new BigInteger("550c7dc3d5ffb4e2", 16),
new BigInteger("72be5d74f27b896f", 16), new BigInteger("80deb1fe3b1696b1", 16), new BigInteger("9bdc06a725c71235", 16),
new BigInteger("c19bf174cf692694", 16), new BigInteger("e49b69c19ef14ad2", 16), new BigInteger("efbe4786384f25e3", 16),
new BigInteger("0fc19dc68b8cd5b5", 16), new BigInteger("240ca1cc77ac9c65", 16), new BigInteger("2de92c6f592b0275", 16),
new BigInteger("4a7484aa6ea6e483", 16), new BigInteger("5cb0a9dcbd41fb44", 16), new BigInteger("76f988da831153b5", 16),
new BigInteger("983e5152ee66dfab", 16), new BigInteger("a831c66d2db43210", 16), new BigInteger("b00327c898fb213f", 16),
new BigInteger("bf597fc7beef0ee4", 16), new BigInteger("c6e00bf33da88fc2", 16), new BigInteger("d5a79147930aa725", 16),
new BigInteger("06ca6351e003826f", 16), new BigInteger("142929670a0e6e70", 16), new BigInteger("27b70a8546d22ffc", 16),
new BigInteger("2e1b21385c26c926", 16), new BigInteger("4d2c6dfc5ac42aed", 16), new BigInteger("53380d139d95b3df", 16),
new BigInteger("650a73548baf63de", 16), new BigInteger("766a0abb3c77b2a8", 16), new BigInteg