zoukankan      html  css  js  c++  java
  • Golang中mac地址+时间戳加入rand.Seed()产生随机数

    记录一下用mac地址+local时间作为seed来产生随机数

    // 首先记录一下rand.Seed()怎么用
    // 官方说明,传入int64数据为Seed
    func (r *Rand) Seed(seed int64)
    // Seed uses the provided seed value to initialize the generator to a deterministic state.
    // Seed使用提供的seed值将发生器初始化为确定性状态。
    导致每次rand出来的都是一样的,所以至少我要加入时间戳为随机数种子
    // 获取时间戳函数使用示例
    t1 := time.Now().Unix()            // 单位s,打印结果:1491888244
    t2 := time.Now().UnixNano()       // 单位纳秒,打印结果:
    
    // output 精度的差别
    1491888244752784461
    type:int64

    完整代码:

    package main
    
    import (
        "fmt"
        "net"
        "time"
        "hash/fnv"
    )
    
    /* 加密 encryption */
    // net 
    func GetMacAddrs()(string,error){
          netInterfaces, err := net.Interfaces()
          if err != nil {
              return "",err
          }
    
         for _, netInterface := range netInterfaces {
              macAddr := netInterface.HardwareAddr.String()
                  if len(macAddr) == 0 {
                  continue
              }
             return macAddr,nil
          }
         return "",err
    }
    
    // hash output uint32
    func Hash(s string) uint32{
            h := fnv.New32a()
            h.Write([]byte(s))
            return h.Sum32()
    }
    
    // add mac and time.now() as seed
    func Hashseed() int64{
            mac_adr, _ := GetMacAddrs()
            t := time.Now().UnixNano() // int64
            return int64(Hash(fmt.Sprintf("%d %s",t,mac_adr)))
    }
    
    func main(){
       
          rand.Seed(Hashseed())
          rnd := make([]byte,4)
          binary.LittleEndian.PutUint32(rnd, rand.Uint32())
           fmt.Println(rnd)
    
    }
  • 相关阅读:
    oracle 删除表中重复数据留一条
    C# 特性
    oracle 常用简单命令语句
    2017年学习计划
    java web开发基础学习
    Java Axis2支持json
    java基础教程
    axis2 发布webservice
    孤荷凌寒自学python第103天认识区块链017
    孤荷凌寒自学python第102天认识区块链016
  • 原文地址:https://www.cnblogs.com/kumata/p/10157409.html
Copyright © 2011-2022 走看看