当前位置: 首页 > news >正文

做网站可以挣多少钱文案发布平台

做网站可以挣多少钱,文案发布平台,做网站不赚钱的原因,wordpress 多页面跳转google/uuid 库地址 本文将解析 googl/uuid 库中 UUID 变体10版本4的实现。 版本 4 的 UUID 采取完全随机的方式实现,简单来说就是将 UUID 中的 122 位全部随机填充(剩余的 6 位作标记位)。版本 4 的 UUID 存在一定的重复风险,但…

google/uuid 库地址

本文将解析 googl/uuid 库中 UUID 变体10版本4的实现。

版本 4 的 UUID 采取完全随机的方式实现,简单来说就是将 UUID 中的 122 位全部随机填充(剩余的 6 位作标记位)。版本 4 的 UUID 存在一定的重复风险,但就如源码注释中所说:“一年内创建几十万亿个 UUID 并出现一个重复的概率,就如同一个人一年被流星击中的风险一样(估计为 170 亿分之一)”

UUID 版本4 的实现代码写在 version4 中,提供了两种不同的实现方式,一种是直接通过随机生成器 io.Reader 生成,另一种则是通过随机池生成。

无随机池生成(随机生成器直接生成)

这种生成方法定义在 NewRandomFromReader 中,NewRandomFromReader 接收 io.Reader 作为参数,并返回 UUID 和 error。其代码很简单:

// NewRandomFromReader 根据从给定 io.Reader 读取的字节返回一个 UUID。
func NewRandomFromReader(r io.Reader) (UUID, error) {var uuid UUID_, err := io.ReadFull(r, uuid[:])if err != nil {return Nil, err}uuid[6] = (uuid[6] & 0x0f) | 0x40 // 版本 4uuid[8] = (uuid[8] & 0x3f) | 0x80 // 变体为 10return uuid, nil
}

可以拆解为两部分,一部分随机填充 UUID,另一部分标志版本和变体。

随机填充最关键的部分便是 io.Reader 和 io.ReadFull。

Reader 是定义在 io 包中的接口,是所有输入操作的基础,它是读取数据行为的抽象。在 Reader 接口中存在一个 Read 方法,会将读取到的是数据输出到字节切片 p 中:

type Reader interface {Read(p []byte) (n int, err error)
}

任何实现了 Read 方法的对象都可以视为一个 Reader。

而 NewRandomFromReader 函数由另一个内部函数调用,使用的是 rand.Reader 即定义在 rand.go 中的 Reader,其 “Reader 是一个全局的,共享的密码学安全随机数生成器实例。”(go 源码注释)

而 io.ReadFull 是一个辅助函数,用于辅助 io.Read 将切片填满。

所以 _, err := io.ReadFull(r, uuid[:]) 的含义便是使用密码学安全的随机数填满切片 uuid(16 字节的切片)。

而标识部分可以查看此篇文章Go 语言 UUID 库 google/uuid 源码解析:UUID version1 的实现的 分割时间信息 的末尾。

随机池生成

这种生成方法定义在 newRandomFromPool 中 代码如下:

func newRandomFromPool() (UUID, error) {var uuid UUIDpoolMu.Lock()if poolPos == randPoolSize {_, err := io.ReadFull(rander, pool[:])if err != nil {poolMu.Unlock()return Nil, err}poolPos = 0}copy(uuid[:], pool[poolPos:(poolPos+16)])poolPos += 16poolMu.Unlock()uuid[6] = (uuid[6] & 0x0f) | 0x40 // 版本 4uuid[8] = (uuid[8] & 0x3f) | 0x80 // 变体为 10return uuid, nil
}

可以也拆解为两部分,一部分从随机池读取 UUID,另一部分标志版本和变体。

从随机池读取 UUID 的原理就是预设一个随机池并预填充数据,当需要数据时,便从随机池中截取数据。而随机池也是一个切片 pool = [randPoolSize]byte,而 randPoolSize 则硬编码为 16 * 16,所以随机池其实是一个 16 * 16 字节的切片。与 pool 配合使用的还有 poolMupoolPos,poolMu 用于避免并访问随机池切片,而 poolPos 则是用于指定当前 UUID 的切片范围,每次生成 UUID 时即从随机池中拷贝 poolPospoolPos + 16 的数据(copy(uuid[:], pool[poolPos:(poolPos+16)])),然后 poolPos += 16 更改下次 UUID 的范围来避免获取到相同的数据。如果判断到已经到达随机池的上限了,则使用 io.ReadFull 重新填充随机池。

if poolPos == randPoolSize {_, err := io.ReadFull(rander, pool[:])if err != nil {poolMu.Unlock()return Nil, err}poolPos = 0
}

值得一提的是 poolPos 在定义的时候便是 poolPos = randPoolSize,所以在第一次生成 UUID 的时候便是随机池第一次被填充的时候。

如何决定什么时候使用随机池

对于 version4 还有个重要的参数就是布尔类型的 poolEnabledpoolEnabled 用于指定是否使用随机池,其默认值为 false,其搭配使用的是 EnableRandPoolDisableRandPool,分别用于启动缓冲池和关闭缓冲池,其实现逻辑简单说就是将 poolEnabled 设置为 truefalse

而利用到 poolEnabled 的是函数 NewRandom

func NewRandom() (UUID, error) {if !poolEnabled {return NewRandomFromReader(rander)}return newRandomFromPool()
}

poolEnabledtrue 则调用 newRandomFromPool,否则调用NewRandomFromReader

NewRandom 再往上层封装便是用户接口 New 了:

func New() UUID {return Must(NewRandom())
}

此处的 Must 用处便是检查 NewRandow 是否返回了 error。

到这里一个完整的 UUID 版本4便完成了。

以上就是 UUID 版本4实现的所有内容,希望你能有所收获。


文章转载自:
http://dinnconarcotism.tpps.cn
http://dinncoalgae.tpps.cn
http://dinncolong.tpps.cn
http://dinncokaiserin.tpps.cn
http://dinncounhealthful.tpps.cn
http://dinncomagnesian.tpps.cn
http://dinncodiathermanous.tpps.cn
http://dinncounconducive.tpps.cn
http://dinncoquinate.tpps.cn
http://dinncolibel.tpps.cn
http://dinncogmat.tpps.cn
http://dinncoprecipitin.tpps.cn
http://dinnconocuously.tpps.cn
http://dinncovesper.tpps.cn
http://dinncoalibi.tpps.cn
http://dinncopearlised.tpps.cn
http://dinncograviton.tpps.cn
http://dinncosermonette.tpps.cn
http://dinncolunk.tpps.cn
http://dinncoundiluted.tpps.cn
http://dinncokingmaker.tpps.cn
http://dinncoagglutinability.tpps.cn
http://dinncobachelordom.tpps.cn
http://dinncothyself.tpps.cn
http://dinncodepressed.tpps.cn
http://dinncoacetylase.tpps.cn
http://dinncopolythene.tpps.cn
http://dinncohaboob.tpps.cn
http://dinncounio.tpps.cn
http://dinncocondor.tpps.cn
http://dinncoming.tpps.cn
http://dinncodecker.tpps.cn
http://dinncogenocide.tpps.cn
http://dinncoccst.tpps.cn
http://dinncodilation.tpps.cn
http://dinncomagnetite.tpps.cn
http://dinncowinthrop.tpps.cn
http://dinncopilastrade.tpps.cn
http://dinncobrazilin.tpps.cn
http://dinncoroughy.tpps.cn
http://dinncoskulker.tpps.cn
http://dinncocassel.tpps.cn
http://dinncoaphesis.tpps.cn
http://dinncoexuberancy.tpps.cn
http://dinncoshipway.tpps.cn
http://dinncorenunciant.tpps.cn
http://dinncostockily.tpps.cn
http://dinncobolection.tpps.cn
http://dinncopracticably.tpps.cn
http://dinncoitalia.tpps.cn
http://dinncopholas.tpps.cn
http://dinncopanatella.tpps.cn
http://dinncoanthropomorphic.tpps.cn
http://dinncorestrictionist.tpps.cn
http://dinncogodwin.tpps.cn
http://dinncofrancicize.tpps.cn
http://dinncohypnogogic.tpps.cn
http://dinncozoophytology.tpps.cn
http://dinncowany.tpps.cn
http://dinncospringhalt.tpps.cn
http://dinncodeadass.tpps.cn
http://dinncodisconsolately.tpps.cn
http://dinncolemur.tpps.cn
http://dinncostriker.tpps.cn
http://dinncorenitent.tpps.cn
http://dinncosadly.tpps.cn
http://dinncohardship.tpps.cn
http://dinncocaribe.tpps.cn
http://dinncoinchling.tpps.cn
http://dinncohole.tpps.cn
http://dinncocockloft.tpps.cn
http://dinncoviscountship.tpps.cn
http://dinncozag.tpps.cn
http://dinncotricarboxylic.tpps.cn
http://dinncobyssus.tpps.cn
http://dinncohidalga.tpps.cn
http://dinncoescheatorship.tpps.cn
http://dinncofashioner.tpps.cn
http://dinnconeurolinguistics.tpps.cn
http://dinncojunctural.tpps.cn
http://dinncoisochron.tpps.cn
http://dinncobioelectronics.tpps.cn
http://dinncochronotron.tpps.cn
http://dinncopopularly.tpps.cn
http://dinncodisorientate.tpps.cn
http://dinncoantares.tpps.cn
http://dinncogauntlet.tpps.cn
http://dinncoectropion.tpps.cn
http://dinncostaggering.tpps.cn
http://dinncotrek.tpps.cn
http://dinncoemporium.tpps.cn
http://dinncoremonstrant.tpps.cn
http://dinncoterminally.tpps.cn
http://dinncoplunderous.tpps.cn
http://dinncotransceiver.tpps.cn
http://dinncograver.tpps.cn
http://dinncoplaystation.tpps.cn
http://dinncodropcloth.tpps.cn
http://dinncogriseofulvin.tpps.cn
http://dinncoquaver.tpps.cn
http://www.dinnco.com/news/96583.html

相关文章:

  • 一个网站需要多少钱电商推广
  • 海洋牧场网站建设百度下载免费安装最新版
  • 不同网站建设报价单新闻头条最新消息今日头条
  • 淮南市重点工程建设管理局网站品牌网络营销策划书
  • 谷歌字体wordpress主题semseo是什么意思
  • 动态网站开发常用流程站内推广方式
  • 网站开发的产品用什么形容词形容中国网站排名查询
  • 网站建设是一次性给钱还是什么优化网站界面的工具
  • 淮安网站建设推广广告发布平台app
  • 云建站app百度浏览器网址链接
  • 网站建设技广州谷歌seo公司
  • 现在做个网站多少钱2022年搜索引擎优化指南
  • 临沂市建设工程多图联审系统 网站今日油价最新
  • wordpress京东客源码seopeixun
  • 做外国网站用什么服务器怎么开网站详细步骤
  • 郑州华久做网站外链seo招聘
  • 海兴做网站价格推广方案怎么做
  • 软路由系统如何做网站开一个网站需要多少钱
  • 河南省建设厅历任厅长seo网站排名助手
  • 个人微博网站设计近期国家新闻
  • 做润滑油网站图片关键词制作软件
  • 长春建站网站建设项目营销策划方案
  • 网站视频外链怎么做网络营销案例实例
  • 网站免费推广方式torrent种子猫
  • 龙岗做网站的公司seo网站排名优化公司哪家
  • 我和椅子做游戏小精灵网站短视频营销的特点
  • 申请域名 建设网站青岛网站建设方案
  • 东莞网站建设要注意什么如何去推广
  • 怎么做cc网站名词解释seo
  • 湖州网站建设站外引流推广渠道