// Package sha512x 提供 SHA-384 与 SHA-512 摘要计算,以及十六进制/Base64 编码与流式、文件接口。 // // 命名约定:带位数后缀的函数(Sum384、Hex384、New384 等)明确指定算法变体; // 不带后缀的 Sum、Hex、Base64、New、SumReader、HexReader、HexFile 等价于 512 位变体, // 因为 SHA-512 是本包最常用的变体。 package sha512x import ( "crypto/sha512" "encoding/base64" "encoding/hex" "fmt" "hash" "io" "os" ) const ( // Size384 是 SHA-384 摘要的字节数(48)。 Size384 = sha512.Size384 // Size512 是 SHA-512 摘要的字节数(64)。 Size512 = sha512.Size // BlockSize 是 SHA-384/SHA-512 分组的字节数(128)。 BlockSize = sha512.BlockSize ) // New384 返回一个计算 SHA-384 摘要的 hash.Hash。 func New384() hash.Hash { return sha512.New384() } // New512 返回一个计算 SHA-512 摘要的 hash.Hash。 func New512() hash.Hash { return sha512.New() } // New 等价于 New512。 func New() hash.Hash { return New512() } // Sum384 返回 data 的 SHA-384 摘要(Size384 字节原始数据)。 func Sum384(data []byte) []byte { return sum(sha512.New384(), data) } // Sum512 返回 data 的 SHA-512 摘要(Size512 字节原始数据)。 func Sum512(data []byte) []byte { return sum(sha512.New(), data) } // Sum 等价于 Sum512。 func Sum(data []byte) []byte { return Sum512(data) } // Hex384 返回 data 的 SHA-384 摘要的小写十六进制字符串。 func Hex384(data []byte) string { return hex.EncodeToString(Sum384(data)) } // Hex512 返回 data 的 SHA-512 摘要的小写十六进制字符串。 func Hex512(data []byte) string { return hex.EncodeToString(Sum512(data)) } // Hex 等价于 Hex512。 func Hex(data []byte) string { return Hex512(data) } // Base64Sum384 返回 data 的 SHA-384 摘要的标准 Base64 字符串。 func Base64Sum384(data []byte) string { return base64.StdEncoding.EncodeToString(Sum384(data)) } // Base64Sum512 返回 data 的 SHA-512 摘要的标准 Base64 字符串。 func Base64Sum512(data []byte) string { return base64.StdEncoding.EncodeToString(Sum512(data)) } // Base64 等价于 Base64Sum512。 func Base64(data []byte) string { return Base64Sum512(data) } // SumReader 读取 r 中的全部数据并返回其 SHA-512 摘要;读取失败时返回包装后的 error。 func SumReader(r io.Reader) ([]byte, error) { return sumReader(sha512.New(), r) } // HexReader 读取 r 中的全部数据并返回其 SHA-512 摘要的小写十六进制字符串。 func HexReader(r io.Reader) (string, error) { sum, err := SumReader(r) if err != nil { return "", err } return hex.EncodeToString(sum), nil } // HexFile 计算 path 所指向文件的 SHA-512 摘要并返回小写十六进制字符串; // 文件不存在或读取失败时返回包装后的 error,不 panic。 func HexFile(path string) (string, error) { f, err := os.Open(path) if err != nil { return "", fmt.Errorf("sha512x: 打开文件 %q 失败: %w", path, err) } defer f.Close() sum, err := sumReader(sha512.New(), f) if err != nil { return "", fmt.Errorf("sha512x: 计算文件 %q 摘要失败: %w", path, err) } return hex.EncodeToString(sum), nil } // sum 把 data 一次性写入 h 并取出摘要。 func sum(h hash.Hash, data []byte) []byte { _, _ = h.Write(data) return h.Sum(nil) } // sumReader 把 r 的全部内容写入 h 并取出摘要。 func sumReader(h hash.Hash, r io.Reader) ([]byte, error) { if r == nil { return nil, fmt.Errorf("sha512x: 读取器为 nil") } if _, err := io.Copy(h, r); err != nil { return nil, fmt.Errorf("sha512x: 读取数据失败: %w", err) } return h.Sum(nil), nil }