gitalk icon indicating copy to clipboard operation
gitalk copied to clipboard

快速产生一个随机字符串

Open smallnest opened this issue 7 years ago • 6 comments

https://colobu.com/2018/09/02/generate-random-string-in-Go/

smallnest avatar Sep 02 '18 09:09 smallnest

牛,涨见识了

MVC4 avatar Dec 18 '18 03:12 MVC4

const ( FormatDateTime = "2006-01-02 15:04:05"

// FmtyyyyMMdd 年月日
FmtyyyyMMdd = "20060102"
chars       = "0123456789_abcdefghijkl-mnopqrstuvwxyz" //ABCDEFGHIJKLMNOPQRSTUVWXYZ
charsLen    = len(chars)
mask        = 1<<6 - 1

)

var rng = rand.NewSource(time.Now().UnixNano())

// RandStr 返回指定长度的随机字符串 func RandStr(ln int) string { /* chars 38个字符 * rng.Int63() 每次产出64bit的随机数,每次我们使用6bit(2^6=64) 可以使用10次 */ buf := make([]byte, ln) for idx, cache, remain := ln, rng.Int63(), 10; idx > 0; { if remain == 0 { cache, remain = rng.Int63(), 10 } buf[idx-1] = chars[int(cache&mask)%charsLen] cache >>= 6 remain-- idx-- } return *(*string)(unsafe.Pointer(&buf)) }

BenchmarkRandStr16-8 20000000 72.0 ns/op 16 B/op 1 allocs/op

zxysilent avatar Jan 30 '19 02:01 zxysilent

const ( FormatDateTime = "2006-01-02 15:04:05"

// FmtyyyyMMdd 年月日
FmtyyyyMMdd = "20060102"
chars       = "0123456789_abcdefghijkl-mnopqrstuvwxyz" //ABCDEFGHIJKLMNOPQRSTUVWXYZ
charsLen    = len(chars)
mask        = 1<<6 - 1

)

var rng = rand.NewSource(time.Now().UnixNano())

// RandStr 返回指定长度的随机字符串 func RandStr(ln int) string { /* chars 38个字符 * rng.Int63() 每次产出64bit的随机数,每次我们使用6bit(2^6=64) 可以使用10次 */ buf := make([]byte, ln) for idx, cache, remain := ln-1, rng.Int63(), 10; idx >= 0; { if remain == 0 { cache, remain = rng.Int63(), 10 } buf[idx] = chars[int(cache&mask)%charsLen] cache >>= 6 remain-- idx-- } return *(*string)(unsafe.Pointer(&buf)) }

BenchmarkRandStr16-8 20000000 68.1 ns/op 16 B/op 1 allocs/op

zxysilent avatar Jan 30 '19 02:01 zxysilent

const (
	letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	letterIdxMask = 1<<6 - 1 // All 1-bits, as many as 6
)


var src = rand.NewSource(time.Now().UnixNano())

func RandStringBytesMaskImprSrc(n int) string {
	b := make([]byte, n)
	// A src.Int63() generates 63 random bits, enough for 10 characters!
	for i, cache, remain := n-1, src.Int63(), 10; i >= 0; {
		if remain == 0 {
			cache, remain = src.Int63(), 10
		}
		b[i] = letterBytes[int(cache & letterIdxMask)%len(letterBytes)]
		i--
		cache >>= 6
		remain--
	}
	return  *(*string)(unsafe.Pointer(&b))
}

heyuanchao avatar Mar 22 '19 08:03 heyuanchao

https://stackoverflow.com/questions/22892120/how-to-generate-a-random-string-of-a-fixed-length-in-go/22892986#22892986

原答案

yy-dev7 avatar Sep 24 '20 02:09 yy-dev7

rajaburma88 Welcome to the trusted website

metal848 avatar Mar 15 '25 21:03 metal848