返回信息流package main
import (
"crypto/md5"
"fmt"
"io"
)
func main() {
h := md5.New()
io.WriteString(h, "The fog is getting thicker!")//标号1
io.WriteString(h, "And Leon's getting laaarger!")//标号2
fmt.Printf("%x", h.Sum(nil))
}
h的sum方法是什么意思?以nil作为参数是什么意思?
标号1和标号2的代码是否注释掉,结果不同,为什么?
这是一条镜像帖。来源:北邮人论坛 / golang / #431同步于 2016/7/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
[问题]【hash函数】想问大神,hash的sum方法
zpb6207869
2016/7/2镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
go官方的文档说得很含糊,不怪楼主。
看看我们Python大法吧。瞧这文档,瞧这API设计,多优美,连小学生都可以使用:
https://docs.python.org/3/library/hashlib.html
还告诉用户某些算法有已知的弱点(为王小云博士点赞!),让用户妥善选择哈希算法。
看下[源码](https://golang.org/src/crypto/md5/md5.go?s=913:933#L41)就知道了
// New returns a new hash.Hash computing the MD5 checksum.
func New() hash.Hash {
d := new(digest)
d.Reset()
return d
}
func (d0 *digest) Sum(in []byte) []byte {
// Make a copy of d0 so that caller can keep writing and summing.
d := *d0
hash := d.checkSum()
return append(in, hash[:]...)
}
New 方法生成一个 digest 对象,其 `Sum`方法就是计算校验和,跟直接进行`Sum`不同之处在于他把计算的值加上了输入的`in`的ASCII,至于`nil`就是不加前缀咯。[可以看这个演示](https://play.golang.org/p/fgrGJtq-G1)
【 在 zpb6207869 的大作中提到: 】
: package main
: import (
: "crypto/md5"
: ...................
暖神晚上都不用睡觉的么
【 在 nuanyangyang 的大作中提到: 】
: go官方的文档说得很含糊,不怪楼主。
: 看看我们Python大法吧。瞧这文档,瞧这API设计,多优美,连小学生都可以使用:
: https://docs.python.org/3/library/hashlib.html
: ...................
read the f**king source code啊,又想起了读Ruby标准库里的web服务器的时候了。那文档简练得可以和Go有一拼了。
【 在 nullne 的大作中提到: 】
: [md]
: 看下[源码](https://golang.org/src/crypto/md5/md5.go?s=913:933#L41)就知道了
: // New returns a new hash.Hash computing the MD5 checksum.
: ...................
是的,本来我也是打算看下文档,但是发现文档里并没有说清楚。
【 在 nuanyangyang 的大作中提到: 】
: read the f**king source code啊,又想起了读Ruby标准库里的web服务器的时候了。那文档简练得可以和Go有一拼了