我正在尝试在go中构建一个base64编码的sha1哈希,但我得到的结果与其他编程语言的结果非常不同
package main
import (
"crypto/sha1"
"encoding/base64"
"fmt"
)
func main() {
c := sha1.New()
input := []byte("hello")
myBytes := c.Sum(input)
fmt.Println(base64.StdEncoding.EncodeToString(base64.StdPadding))
}
此Go Code打印出aGVsbG/aOaPuXmtLDTJVv++VYBiQr9gHCQ==
我的Python代码看起来像这样
import hashlib
import base64
print(base64.b64encode(hashlib.sha1('hello').digest()))
输出qvTGHdzF6KLavt4PO0gs2a6pQ00=
用于比较的我的bash命令如下所示
echo -n hello| openssl dgst -sha1 -binary |base64
并输出此qvTGHdzF6KLavt4PO0gs2a6pQ00=
这让我假设python代码正在做所有事情。 但为什么要打印另一个结果。 我的错误在哪里?
Thnx提前
答案 0 :(得分:10)
您以完全错误的方式使用标准库。不要假设方法/功能的作用,如果对您不熟悉,请务必阅读文档。
sha1.New()
返回hash.Hash
。其Sum()
方法不来计算哈希值,但要获取当前哈希值,它不会更改基础哈希状态。
hash.Hash
实现io.Writer
,并且要计算某些数据的哈希值,您必须将该数据写入其中。 Hash.Sum()
如果已经分配了一个可选切片,则将结果(散列)写入其中。如果您希望分配新的nil
,请通过base64.StdEncoding.EncodeToString()
。
同样EncodeToString()
期望您要转换为base64的字节数据(字节片),因此您必须将校验和数据传递给它。在您的代码中,您没有告诉c := sha1.New()
input := []byte("hello")
c.Write(input)
sum := c.Sum(nil)
fmt.Println(base64.StdEncoding.EncodeToString(sum))
要编码的内容。
工作示例:
qvTGHdzF6KLavt4PO0gs2a6pQ00=
输出符合预期(在Go Playground上尝试):
input := []byte("hello")
sum := sha1.Sum(input)
fmt.Println(base64.StdEncoding.EncodeToString(sum[:]))
请注意,crypto/sha1
包还有一个方便的sha1.Sum()
功能,只需一步即可完成此操作:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key
constraint (SQL
: alter table `user_class` add constraint
`user_class_class_id_foreign`
foreign key (`class_id`) references `classes` (`id`))
[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key
constraint
输出是一样的。在Go Playground上尝试。
答案 1 :(得分:3)
如何正确使用它有example。你应该这样做:
update table t1
set B = (select nvl(max(b),sequence_name.nextval) from table where a=t1.a)