当前位置:首页 > 文章列表 > Golang > Go教程 > Go crypto/sha256 New 和 Sum256 怎么选

Go crypto/sha256 New 和 Sum256 怎么选

来源:17golang原创 2026-09-15 14:28:50 0浏览 收藏

在 Go 里计算一段数据的 SHA-256,最容易遇到的选择就是 sha256.New()sha256.Sum256()。结论很直接:数据已经完整放在 []byte 中,而且只计算一次,优先用 Sum256;数据来自文件、网络或分块读取,需要持续写入时,用 New

要点速览
  • Sum256(data) 一次接收完整数据,返回固定类型 [32]byte
  • New() 返回 hash.Hash,可以多次 Write,适合流式输入。
  • 两条路径对同一字节序列得到相同摘要,但输入边界和结果类型不同。

先看输入:一次性字节还是持续数据流

Sum256 的参数是完整的 []byte。配置项、短字符串、请求体已经读入内存时,直接调用最清楚;返回值是长度为 32 的数组,打印或比较时可以直接使用。

New 返回一个实现了 hash.Hash 的摘要对象。它不要求一开始就拥有全部数据,可以边读边写,因而不会为了调用摘要函数而额外拼出一个完整的大切片。

Go crypto/sha256 中一次性 []byte 选择 Sum256、持续数据流选择 New 的输入分流结构图
图1:sha256.New 与 sha256.Sum256 的输入选择说明图,不是运行截图或执行证据。

两种写法的返回类型并不相同

先看最小示例。示例中的注释说明了关键类型,输出使用十六进制只是为了便于阅读,并没有改变摘要本身。

package main

import (
	"crypto/sha256"
	"fmt"
)

func main() {
	data := []byte("go digest")

	// Sum256 一次处理完整字节切片,结果是 [32]byte。
	fixed := sha256.Sum256(data)
	fmt.Printf("sum256=%x\n", fixed)

	// New 返回 hash.Hash;Write 可以在多个阶段持续接收数据。
	h := sha256.New()
	_, _ = h.Write([]byte("go ")) // 这里写入第一段数据。
	_, _ = h.Write([]byte("digest")) // 这里写入第二段数据。
	streamed := h.Sum(nil) // Sum(nil) 取出当前摘要字节,不负责重新计算输入。
	fmt.Printf("new=%x\n", streamed)
}

两行输出的摘要应当一致,因为两次调用接收的字节顺序都是 go digest。差异在于:fixed 是数组,streamed 是字节切片;前者适合直接作为值传递,后者更适合接到编码、写文件或网络响应的后续流程。

New 的关键是 Write 与 Sum 的两段式流程

处理文件时,通常让 io.Copy 把读取到的数据直接写入摘要对象。这里要检查打开文件和复制过程的错误;defer f.Close() 只负责释放文件描述符,不能代替 io.Copy 的错误处理。

import (
	"crypto/sha256"
	"io"
	"os"
)

func fileSHA256(path string) ([]byte, error) {
	// 打开文件后及时安排关闭,避免异常返回时泄漏文件描述符。
	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer f.Close()

	// io.Copy 让文件按流写入 hash.Hash,不需要把整个文件读进内存。
	h := sha256.New()
	if _, err := io.Copy(h, f); err != nil {
		return nil, err
	}
	// Sum(nil) 返回当前累计状态的摘要字节,传 nil 表示不追加到已有切片。
	return h.Sum(nil), nil
}

这段函数需要补齐 crypto/sha256ioos 导入。实际项目里,如果读取器本身可能返回错误,仍然应该把错误向上返回,而不是只看最终摘要。

Go hash.Hash 通过 Write 累计状态并由 Sum(nil) 输出摘要字节的结果类型边界图
图2:hash.Hash 累计状态与摘要结果的边界说明图,不是运行截图或执行证据。

按这张清单决定用哪个 API

场景建议原因
短字符串、完整请求体、已存在的 []bytesha256.Sum256代码短,返回 [32]byte,比较直观
大文件、网络响应、分块上传sha256.New多次 Write,不必集中保存全部输入
需要复用摘要对象处理新的独立输入重新调用 New每个摘要应有独立累计状态
需要字符串展示fmt.Sprintf("%x", sum)十六进制是展示格式,不是新的摘要算法

还有一个容易混淆的边界:SHA-256 是摘要,不是加密。摘要不能靠“解密”恢复原文;如果场景是密码存储、消息认证或数字签名,还需要按具体威胁模型选择专用方案,不能只因为能得到一串十六进制字符就认为完成了安全设计。

常见问题

sha256.New 和 sha256.Sum256 算出来的值一样吗?

只要输入字节完全相同、顺序也相同,摘要值一样。区别主要是输入方式和返回类型,不是算法不同。

为什么不能把文件直接传给 Sum256?

Sum256 只接收 []byte。文件应通过 New 配合 io.Copy 或循环 Write 处理,避免一次性加载整个文件。

h.Sum(nil) 会清空 hash.Hash 吗?

不要把 Sum(nil) 当成清空操作。它读取当前累计状态并返回摘要;如果要处理另一份独立数据,直接新建一个 sha256.New() 更容易表达边界。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go trace scheduler 延迟和 CPU profile 如何配合Go trace scheduler 延迟和 CPU profile 如何配合
上一篇
Go trace scheduler 延迟和 CPU profile 如何配合
Java Jackson record 缺少 JSON 字段时如何设默认
下一篇
Java Jackson record 缺少 JSON 字段时如何设默认
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    40次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    135次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    72次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    29次使用
  • CMMLU中文大模型评估基准:功能、使用教程与应用场景解析
    CMMLU
    深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
    19次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码