• golang random string


    package main
    
    import (
    	"math/rand"
    	"strings"
    	"testing"
    	"time"
    	"unsafe"
    )
    
    // Implementations
    
    func init() {
    	rand.Seed(time.Now().UnixNano())
    }
    
    var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    
    func RandStringRunes(n int) string {
    	b := make([]rune, n)
    	for i := range b {
    		b[i] = letterRunes[rand.Intn(len(letterRunes))]
    	}
    	return string(b)
    }
    
    const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    const (
    	letterIdxBits = 6                    // 6 bits to represent a letter index
    	letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
    	letterIdxMax  = 63 / letterIdxBits   // # of letter indices fitting in 63 bits
    )
    
    func RandStringBytes(n int) string {
    	b := make([]byte, n)
    	for i := range b {
    		b[i] = letterBytes[rand.Intn(len(letterBytes))]
    	}
    	return string(b)
    }
    
    func RandStringBytesRmndr(n int) string {
    	b := make([]byte, n)
    	for i := range b {
    		b[i] = letterBytes[rand.Int63()%int64(len(letterBytes))]
    	}
    	return string(b)
    }
    
    func RandStringBytesMask(n int) string {
    	b := make([]byte, n)
    	for i := 0; i < n; {
    		if idx := int(rand.Int63() & letterIdxMask); idx < len(letterBytes) {
    			b[i] = letterBytes[idx]
    			i++
    		}
    	}
    	return string(b)
    }
    
    func RandStringBytesMaskImpr(n int) string {
    	b := make([]byte, n)
    	// A rand.Int63() generates 63 random bits, enough for letterIdxMax letters!
    	for i, cache, remain := n-1, rand.Int63(), letterIdxMax; i >= 0; {
    		if remain == 0 {
    			cache, remain = rand.Int63(), letterIdxMax
    		}
    		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
    			b[i] = letterBytes[idx]
    			i--
    		}
    		cache >>= letterIdxBits
    		remain--
    	}
    
    	return string(b)
    }
    
    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 letterIdxMax characters!
    	for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
    		if remain == 0 {
    			cache, remain = src.Int63(), letterIdxMax
    		}
    		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
    			b[i] = letterBytes[idx]
    			i--
    		}
    		cache >>= letterIdxBits
    		remain--
    	}
    
    	return string(b)
    }
    
    func RandStringBytesMaskImprSrcSB(n int) string {
    	sb := strings.Builder{}
    	sb.Grow(n)
    	// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
    	for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
    		if remain == 0 {
    			cache, remain = src.Int63(), letterIdxMax
    		}
    		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
    			sb.WriteByte(letterBytes[idx])
    			i--
    		}
    		cache >>= letterIdxBits
    		remain--
    	}
    
    	return sb.String()
    }
    
    func RandStringBytesMaskImprSrcUnsafe(n int) string {
    	b := make([]byte, n)
    	// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
    	for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
    		if remain == 0 {
    			cache, remain = src.Int63(), letterIdxMax
    		}
    		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
    			b[i] = letterBytes[idx]
    			i--
    		}
    		cache >>= letterIdxBits
    		remain--
    	}
    
    	return *(*string)(unsafe.Pointer(&b))
    }
    
    // Benchmark functions
    
    const n = 16
    
    func BenchmarkRunes(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringRunes(n)
    	}
    }
    
    func BenchmarkBytes(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringBytes(n)
    	}
    }
    
    func BenchmarkBytesRmndr(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringBytesRmndr(n)
    	}
    }
    
    func BenchmarkBytesMask(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringBytesMask(n)
    	}
    }
    
    func BenchmarkBytesMaskImpr(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringBytesMaskImpr(n)
    	}
    }
    
    func BenchmarkBytesMaskImprSrc(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringBytesMaskImprSrc(n)
    	}
    }
    func BenchmarkBytesMaskImprSrcSB(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringBytesMaskImprSrcSB(n)
    	}
    }
    
    func BenchmarkBytesMaskImprSrcUnsafe(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		RandStringBytesMaskImprSrcUnsafe(n)
    	}
    }
    
    
  • 相关阅读:
    lombok 下的@Builder注解用法
    (springboot)自定义Starter
    各种 Spring-Boot-Starters系列 介绍
    MQ的使用场景
    SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
    RPC原理详解
    Java性能优化的50个细节
    thinkphp3.2.2有预览的多图上传
    关于php中的exec命令
    关于thinkphp3.1无法加载模块解决办法
  • 原文地址:https://www.cnblogs.com/yzhch/p/14841708.html
Copyright © 2020-2023  润新知