前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go生成随机数

go生成随机数

作者头像
超级大猪
发布2019-11-22 09:33:37
1.8K0
发布2019-11-22 09:33:37
举报
文章被收录于专栏:大猪的笔记

随机字符串

代码语言:javascript
复制
func GeRnd() string {
    b := make([]byte, 8)
    rand.Read(b)
    return fmt.Sprintf("%x", b)
}

随机数

代码语言:javascript
复制
// RndInt 生成 [start, end]的随机数
func RndInt(start, end int) int {
    du := end - start + 1
    rand.Seed(time.Now().UnixNano())
    return start + rand.Intn(du)
}

真随机数

代码语言:javascript
复制
max := int64(10000)
nBig, err := rand.Int(rand.Reader, big.NewInt(max))
if err != nil {
    log.Println(err)
}
ret := nBig.Int64()

snowflake随机数

代码语言:javascript
复制
package snowflake

import (
    "crypto/rand"
    "log"
    "math"
    "math/big"
    "sync"
    "time"
)

const (
    WORKER_ID_LEN uint  = 14
    FLOW_LEN      uint  = 22 - WORKER_ID_LEN // 8
    INIT_TIME     int64 = 1420041600000
    FLOWMAX       int64 = 256 // 2^FLOW_LEN
)

// SnowFlake 生成分布式流水号
// 0位  时间     workerID        流水号
// 0 - 0 * 41 - 0 * 14 - 0 * 8
type SnowFlake struct {
    workerID int64
    lastTp   int64
    flow     int64
    lk       sync.Mutex
}

func (s *SnowFlake) getWorkerID() int64 {
    if s.workerID != 0 {
        return s.workerID
    }
    max := int64(math.Pow(2, float64(WORKER_ID_LEN)))
    nBig, err := rand.Int(rand.Reader, big.NewInt(max))
    if err != nil {
        log.Println(err)
    }
    ret := nBig.Int64()

    s.workerID = ret
    return s.workerID
}

func (s *SnowFlake) generate(t time.Time) int64 {
    s.lk.Lock()
    defer s.lk.Unlock()

    tp := t.UnixNano() / 1e6
    tp = tp - INIT_TIME

    if tp == s.lastTp {
        s.flow++

        if s.flow > FLOWMAX {
            panic("flow number overflowed")
        }
    } else if tp < s.lastTp {
        // ntpd 对时间进行了回拔,此时必须重新生成 worker_id
        s.workerID = 0
        s.lastTp = tp
        s.flow = 0
    } else {
        s.lastTp = tp
        s.flow = 0
    }

    var ret int64

    ret += tp << (WORKER_ID_LEN + FLOW_LEN)
    ret += s.getWorkerID() << (FLOW_LEN)
    ret += s.flow

    return ret
}

// GetTime 传入一个id,显示这个id映射的时间
func (s *SnowFlake) GetTime(flowno int64) time.Time {
    flowtp := flowno >> (WORKER_ID_LEN + FLOW_LEN)
    utctp := flowtp + INIT_TIME
    tm := time.Unix(utctp/1000, 0)
    return tm
}

// GenerateByTime 传入一个时间,生成一个对应的snowflake id
func (s *SnowFlake) GenerateByTime(t time.Time) int64 {
    return s.generate(t)
}

// Generate 以当前时间生成一个snowflake ID
func (s *SnowFlake) Generate() int64 {
    return s.generate(time.Now())
}

// NewSnowFlake 创建snowflake对象
func NewSnowFlake() *SnowFlake {
    s := new(SnowFlake)
    s.lastTp = 0

    s.flow = 0
    return s
}

把int转成字符串

代码语言:javascript
复制
func int2Str(v int64) string {
    buff := ""
    i := 0
    for v > 0 {
        m := v % 62
        if m <= 9 {
            i++
            buff = string('0'+m) + buff
        } else if m > 9 && m <= 9+26 {
            i++
            buff = string('A'+m-10) + buff
        } else if m > 9+26 && m <= 9+26+26 {
            i++
            buff = string('a'+m-9-26-1) + buff
        }
        v = v / 62
    }
    return buff
}

func int2StrLower(v int64) string {
    buff := ""
    i := 0
    for v > 0 {
        m := v % 36
        if m <= 9 {
            i++
            buff = string('0'+m) + buff
        } else {
            i++
            buff = string('a'+m-10) + buff
        }
        v = v / 36
    }
    for len(buff) < 8 {
        buff = "0" + buff
    }
    return buff
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档