Go 在rand.Seed(time.Now().UTC().UnixNano())中,UTC()调用是否冗余?

Go 在rand.Seed(time.Now().UTC().UnixNano())中,UTC()调用是否冗余?,go,time,timezone,utc,random-seed,Go,Time,Timezone,Utc,Random Seed,互联网上的许多示例使用rand.Seedtime.Now.UTC.UnixNano初始化伪随机数生成器seed 我发现,如果省略UTC调用,它仍然可以正常工作 Unix或UnixNano time是自纪元起的秒数或毫秒数,即1970-01-01 00:00:00.000000000 UTC。Unix或UnixNano时间无论如何都是时区不可知的 以以下代码为例: 包干管 进口 fmt 时间 func main{ 时间,现在 fmt.Printlnt.UnixNano fmt.Printlnt.U

互联网上的许多示例使用rand.Seedtime.Now.UTC.UnixNano初始化伪随机数生成器seed

我发现,如果省略UTC调用,它仍然可以正常工作

Unix或UnixNano time是自纪元起的秒数或毫秒数,即1970-01-01 00:00:00.000000000 UTC。Unix或UnixNano时间无论如何都是时区不可知的

以以下代码为例:

包干管 进口 fmt 时间 func main{ 时间,现在 fmt.Printlnt.UnixNano fmt.Printlnt.UTC.UnixNano }
因此,我的问题是:UTC调用有什么目的吗?或者省略UTC调用而只调用rand.Seedtime.Now.UnixNano是否安全?

您设置了伪随机数生成器种子,以使生成的数字难以猜测

当您查看UTC方法时,您将看到它唯一做的事情是设置位置时区。随机种子生成使用哪个时区无关

重要的是,使用了UnixNano,该平台将以如此高的精度返回时间。否则,可能会猜测随机种子,这可能会考虑:


请考虑一种更安全的初始化随机种子生成器的方法:

< P> >在使用UNIXNYON/P>时,您可以省略UTC。 首先及时查看UTC代码。go:1107:

// UTC returns t with the location set to UTC.
func (t Time) UTC() Time {
    t.setLoc(&utcLoc)
    return t
}
它只设置当前时间的位置

现在,根据time.go文件中In methode的注释,位置信息仅用于显示目的。见时间,开始:1119:

// In returns a copy of t representing the same time instant, but
// with the copy's location information set to loc for display
// purposes.
//
// In panics if loc is nil.
func (t Time) In(loc *Location) Time {
    if loc == nil {
        panic("time: missing Location in call to Time.In")
    }
    t.setLoc(loc)
    return t
}
该位置仅在必须显示时间时使用:

// abs returns the time t as an absolute time, adjusted by the zone offset.
// It is called when computing a presentation property like Month or Hour.
func (t Time) abs() uint64 {
    l := t.loc
    // Avoid function calls when possible.
    if l == nil || l == &localLoc {
        l = l.get()
    }
    sec := t.unixSec()
    if l != &utcLoc {
        if l.cacheZone != nil && l.cacheStart <= sec && sec < l.cacheEnd {
            sec += int64(l.cacheZone.offset)
        } else {
            _, offset, _, _ := l.lookup(sec)
            sec += int64(offset)
        }
    }
    return uint64(sec + (unixToInternal + internalToAbsolute))
}
返回源时间的Unix时间,即自UTC 1970年1月1日以来经过的纳秒数。它总是在UTC区域内解释,无论源时间位于何处。unix时区是独立的。其文件明确指出:

结果不取决于与t关联的位置

所以你不需要打电话,你会得到同样的结果

请参见此示例:

t1, err := time.Parse("2006-01-02 15:04:05 -0700", "2020-07-27 13:50:00 +0200")
if err != nil {
    panic(err)
}
fmt.Printf("%v\n\t%v\n\t%v\n", t1, t1.UnixNano(), t1.UTC().UnixNano())

t2, err := time.Parse("2006-01-02 15:04:05 -0700", "2020-07-27 13:50:00 +0000")
if err != nil {
    panic(err)
}
fmt.Printf("%v\n\t%v\n\t%v\n", t2, t2.UnixNano(), t2.UTC().UnixNano())
我们分析2次输入,一次在非UTC区域,另一次在UTC区域。我们同时打印UnixNano,无论是否调用UTC。结果是一致的

请在以下服务器上尝试输出:

UTC呼叫是否有任何目的-是 省略UTC是否安全-是
这不是必需的。
t1, err := time.Parse("2006-01-02 15:04:05 -0700", "2020-07-27 13:50:00 +0200")
if err != nil {
    panic(err)
}
fmt.Printf("%v\n\t%v\n\t%v\n", t1, t1.UnixNano(), t1.UTC().UnixNano())

t2, err := time.Parse("2006-01-02 15:04:05 -0700", "2020-07-27 13:50:00 +0000")
if err != nil {
    panic(err)
}
fmt.Printf("%v\n\t%v\n\t%v\n", t2, t2.UnixNano(), t2.UTC().UnixNano())
2020-07-27 13:50:00 +0200 +0200
    1595850600000000000
    1595850600000000000
2020-07-27 13:50:00 +0000 UTC
    1595857800000000000
    1595857800000000000