String 戈朗随机筛256

String 戈朗随机筛256,string,random,go,type-conversion,sha256,String,Random,Go,Type Conversion,Sha256,使用时间戳种子获取随机sha256哈希时遇到问题: (不要使用操场-时间总是一样的) 有人知道为什么它总是返回相同的结果吗?(非操场跑步)是。这: string(timestamp) 不做你认为它做的事,看。长话短说,时间戳不是有效的unicode代码点,因此结果总是“\uFFFD”。因为您这样做: timestamp := time.Now().Unix() log.Print(fmt.Sprintf("%x", sha256.Sum256([]byte(string(timestamp))

使用时间戳种子获取随机sha256哈希时遇到问题:

(不要使用操场-时间总是一样的)

有人知道为什么它总是返回相同的结果吗?(非操场跑步)

是。这:

string(timestamp)
不做你认为它做的事,看。长话短说,时间戳不是有效的unicode代码点,因此结果总是“\uFFFD”。

因为您这样做:

timestamp := time.Now().Unix()
log.Print(fmt.Sprintf("%x", sha256.Sum256([]byte(string(timestamp))))[:45])
打印SHA-256数据摘要的十六进制格式:

[]byte(string(timestamp))
到底是什么

时间戳的类型为
int64
,:

将有符号或无符号整数值转换为字符串类型将生成一个包含整数UTF-8表示形式的字符串。超出有效Unicode代码点范围的值将转换为“\uFFFD”

但是它的值不是有效的unicode代码点,因此它将始终是
“\uFFFD”
,即
efbfbd
(UTF-8编码),并且您的代码始终打印数据
[]字节{0xef,0xbf,0xbd}
,这是(或者更确切地说是它的前45个十六进制数字,因为您对结果进行了切片):

我猜您想生成一些随机字节并计算其中的SHA-256,类似这样:

data := make([]byte, 10)
for i := range data {
    data[i] = byte(rand.Intn(256))
}
fmt.Printf("%x", sha256.Sum256(data))
请注意,如果使用包而不是
math/rand
,则可以使用函数用随机值填充字节片,甚至不必设置种子(因此您甚至不需要
time
包):

请张贴您的密码。(指向
play.golang.org
的链接很好,但它不能代替代码本身。)为什么要使用“随机sha256哈希”?sha256散列不是随机的;它是其输入的确定函数。如果您需要的是256位的随机序列,那么为什么需要涉及sha256呢?
data := make([]byte, 10)
for i := range data {
    data[i] = byte(rand.Intn(256))
}
fmt.Printf("%x", sha256.Sum256(data))
data := make([]byte, 10)
if _, err := rand.Read(data); err == nil {
    fmt.Printf("%x", sha256.Sum256(data))
}