GoFrame 唯一數(shù)-guid

2022-04-12 10:47 更新

?guid?提供了更簡(jiǎn)便更高性能的唯一數(shù)生成功能。

?guid?模塊的設(shè)計(jì)目的在于提供一種使用更簡(jiǎn)便、性能更高效且能滿足絕大多數(shù)業(yè)務(wù)場(chǎng)景的唯一數(shù)生成。?guid?的設(shè)計(jì)比較簡(jiǎn)單,詳情可參考實(shí)現(xiàn)源碼。

使用方式:

import "github.com/gogf/gf/v2/util/guid"

接口文檔:

https://pkg.go.dev/github.com/gogf/gf/v2/util/guid

基本介紹

?guid?通過(guò)?S?方法生成32字節(jié)的唯一數(shù),該方法定義如下:

func S(data ...[]byte) string

1、通過(guò)不帶任何參數(shù)的方式使用,該方法生成的唯一數(shù)將會(huì)有以下方式構(gòu)成:

?MAC(7) + PID(4) + TimestampNano(12) + Sequence(3) + RandomString(6) ?

其中:

  • ?MAC?表示當(dāng)前機(jī)器的?MAC?地址哈希值,由7個(gè)字節(jié)構(gòu)成;
  • ?PID?表示當(dāng)前機(jī)器的進(jìn)程?ID?哈希值,由4個(gè)字節(jié)構(gòu)成;
  • ?TimestampNano?表示當(dāng)前的納秒時(shí)間戳哈希值,由12個(gè)字節(jié)構(gòu)成;
  • ?Sequence?表示當(dāng)前進(jìn)程并發(fā)安全的序列號(hào),由3個(gè)字節(jié)構(gòu)成;
  • ?RandomString?表示隨機(jī)數(shù),由6個(gè)字節(jié)構(gòu)成;

2、通過(guò)自定義任何參數(shù)的方式使用,該方法生成的唯一數(shù)將會(huì)有以下方式構(gòu)成:

?Data(7/14) + TimestampNano(12) + Sequence(3) + RandomString(3/10) ?

主要說(shuō)明:

  • ?Data?表示自定義的參數(shù),參數(shù)類型為?[]byte?,最多支持2個(gè)參數(shù)輸入,由7或14個(gè)字節(jié)構(gòu)成;
  • 需要注意的是,輸入的自定義參數(shù)需要在業(yè)務(wù)上具有一定的唯一識(shí)別性,使得生成的唯一數(shù)更有價(jià)值;
  • 不管每一個(gè)?[]byte?參數(shù)長(zhǎng)度為多少,最終都將通過(guò)哈希方式生成7個(gè)字節(jié)的哈希值。
  • ?TimestampNano?表示當(dāng)前的納秒時(shí)間戳哈希值,由12個(gè)字節(jié)構(gòu)成;
  • ?Sequence?表示當(dāng)前進(jìn)程并發(fā)安全的序列號(hào),由3個(gè)字節(jié)構(gòu)成;
  • ?RandomString?表示隨機(jī)數(shù),由3或者10個(gè)字節(jié)構(gòu)成,即:
    • 如果給定1個(gè)自定義參數(shù),那么剩余的字節(jié)將會(huì)使用隨機(jī)數(shù)占位,長(zhǎng)度為10個(gè)字節(jié);
    • 如果給定2個(gè)自定義參數(shù),那么剩余的字節(jié)將會(huì)使用隨機(jī)數(shù)占位,長(zhǎng)度為3個(gè)字節(jié);

示例1,基本使用

package main

import (
	"fmt"
	"github.com/gogf/gf/v2/util/guid"
)

func main() {
	fmt.Printf("TraceId: %s", guid.S())
}

執(zhí)行后,輸出結(jié)果為:

TraceId: oa9sdw03dk0c35q9bdwcnz42p00trwfr

示例2,自定義參數(shù)

我們的?SessionId?生成需要具有比較好的唯一性,且需要防止輕易的碰撞,因此可以使用以下方式:

func CreateSessionId(r *ghttp.Request) string {
    var (
        address = request.RemoteAddr
        header  = fmt.Sprintf("%v", request.Header)
    )
    return guid.S([]byte(address), []byte(header))
}

可以看到,?SessionId?需要依靠自定義的兩個(gè)輸入?yún)?shù)?RemoteAddr?, ?Header?來(lái)生成,這兩個(gè)參數(shù)在業(yè)務(wù)上具有一定的唯一識(shí)別性,且通過(guò)?guid.S?方法的設(shè)計(jì)構(gòu)成,生成的唯一數(shù)將會(huì)非常隨機(jī)且唯一,既滿足了業(yè)務(wù)需要也保證了安全。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)