Browse Source

auto commit

tags/v1.0.0
yitter 3 years ago
parent
commit
84d1d67dcb
22 changed files with 95 additions and 314 deletions
  1. +1
    -0
      .gitignore
  2. +3
    -3
      C/README.md
  3. +43
    -35
      Go/README.md
  4. +1
    -1
      Go/source/go.mod
  5. +15
    -15
      Go/source/idgen/DefaultIdGenerator.go
  6. +1
    -1
      Go/source/idgen/IIdGenerator.go
  7. +1
    -1
      Go/source/idgen/ISnowWorker.go
  8. +1
    -1
      Go/source/idgen/IdGeneratorException.go
  9. +1
    -1
      Go/source/idgen/IdGeneratorOptions.go
  10. +1
    -1
      Go/source/idgen/OverCostActionArg.go
  11. +18
    -5
      Go/source/idgen/SnowWorkerM1.go
  12. +2
    -3
      Go/source/idgen/SnowWorkerM2.go
  13. +2
    -3
      Go/source/idgen/YitIdHelper.go
  14. +4
    -10
      Go/source/main.go
  15. BIN
      Go/source/target/go_build_main_go.exe
  16. BIN
      Go/source/target/main.dll
  17. +0
    -75
      Go/source/target/main.h
  18. BIN
      Go/source/target/yitidgen.dll
  19. +0
    -75
      Go/source/target/yitidgen.h
  20. BIN
      Go/source/target/yitidgengo.dll
  21. +0
    -83
      Go/source/target/yitidgengo.h
  22. +1
    -1
      README.md

+ 1
- 0
.gitignore View File

@@ -252,6 +252,7 @@ paket-files/
# JetBrains Rider
.idea/
*.sln.iml
#target/


# macOS


+ 3
- 3
C/README.md View File

@@ -1,8 +1,8 @@
# idgenerator

## ±àÒë˵Ã÷
## 编译说明

1.ĬÈÏÊÇ Linux »·¾³£¬Óà CMake¡£
1.默认是 Linux 环境,用 CMake。

2.Èç¹ûÊÇ Windows »·¾³£¬ÒªÓà Cygwin »ò MinGW¡£
2.如果是 Windows 环境,�用 Cygwin 或 MinGW。


+ 43
- 35
Go/README.md View File

@@ -1,35 +1,43 @@
# idgenerator

##

Go集成专项工程入口:https://gitee.com/yitter/idgenerator-go

后文内容以 Go 专项工程为准。

## Go环境

1.SDK,go1.16

2.启用 Go-Modules

```
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
```


## Go代码示例
```
var yid = idgen.YitIdHelper{}
fmt.Println(yid.NextId())

// 方法二:自定义参数
var options = contract.NewIdGeneratorOptions(1)
//options.WorkerIdBitLength = 6
//options.SeqBitLength = 6
//options.TopOverCostCount = 2000
//options.BaseTime = time.Date(2020, 2, 20, 2, 20, 2, 20, time.UTC).UnixNano() / 1e6
yid.SetIdGenerator(options)

```

# 鉂勶笍 idenerator-go
## 浠嬬粛
椤圭洰鏇村�浠嬬粛鍙傜収锛歨ttps://github.com/yitter/idgenerator
## Go鐜��
1.SDK锛実o1.14
2.鍚�敤 Go-Modules
```
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
```
3. 瀹夎�鏂瑰紡
```
go get -u -v github.com/yitter/idgenerator-go
```
鎴� go.mod 涓�坊鍔犲紩鐢�
```
require github.com/yitter/idgenerator-go v1.2.0
```
## Go浠g爜绀轰緥
```
// 瀹氫箟鍙傛暟
var options = idgen.NewIdGeneratorOptions(1)
options.WorkerId = 1
options.WorkerIdBitLength = 6
options.SeqBitLength = 6
// ...
idgen.SetIdGenerator(options)
// 璋冪敤鏂规硶鐢熸垚Id
var id = idgen.NextId()
```
## 浠g爜璐$尞鑰�(鎸夋椂闂撮『搴�)
guoyahao | amuluowin | houseme

+ 1
- 1
Go/source/go.mod View File

@@ -1,6 +1,6 @@
module yitidgen

go 1.16
go 1.14

require (
github.com/go-redis/redis v6.15.9+incompatible


+ 15
- 15
Go/source/idgen/DefaultIdGenerator.go View File

@@ -7,18 +7,17 @@
package idgen

import (
"strconv"
"time"
"yitidgen/contract"
"yitidgen/core"
)

type DefaultIdGenerator struct {
Options *contract.IdGeneratorOptions
SnowWorker contract.ISnowWorker
IdGeneratorException contract.IdGeneratorException
Options *IdGeneratorOptions
SnowWorker ISnowWorker
IdGeneratorException IdGeneratorException
}

func NewDefaultIdGenerator(options *contract.IdGeneratorOptions) *DefaultIdGenerator {
func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator {
if options == nil {
panic("dig.Options error.")
}
@@ -32,9 +31,9 @@ func NewDefaultIdGenerator(options *contract.IdGeneratorOptions) *DefaultIdGener
panic("error:WorkerIdBitLength + SeqBitLength <= 22")
}

maxWorkerIdNumber := uint16(1<<options.WorkerIdBitLength) - 1
if options.WorkerId > maxWorkerIdNumber {
panic("WorkerId error. (range:[1, " + string(maxWorkerIdNumber) + "]")
maxWorkerIDNumber := uint16(1<<options.WorkerIdBitLength) - 1
if options.WorkerId > maxWorkerIDNumber {
panic("WorkerId error. (range:[1, " + strconv.FormatUint(uint64(maxWorkerIDNumber), 10) + "]")
}

if options.SeqBitLength < 2 || options.SeqBitLength > 21 {
@@ -43,22 +42,23 @@ func NewDefaultIdGenerator(options *contract.IdGeneratorOptions) *DefaultIdGener

maxSeqNumber := uint32(1<<options.SeqBitLength) - 1
if options.MaxSeqNumber > maxSeqNumber {
panic("MaxSeqNumber error. (range:[1, " + string(maxSeqNumber) + "]")
panic("MaxSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]")
}

if options.MinSeqNumber > maxSeqNumber {
panic("MinSeqNumber error. (range:[1, " + string(maxSeqNumber) + "]")
panic("MinSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]")
}

var snowWorker contract.ISnowWorker

var snowWorker ISnowWorker

switch options.Method {
case 1:
snowWorker = core.NewSnowWorkerM1(options)
snowWorker = NewSnowWorkerM1(options)
case 2:
snowWorker = core.NewSnowWorkerM2(options)
snowWorker = NewSnowWorkerM2(options)
default:
snowWorker = core.NewSnowWorkerM1(options)
snowWorker = NewSnowWorkerM1(options)
}

if options.Method == 1 {


Go/source/contract/IIdGenerator.go → Go/source/idgen/IIdGenerator.go View File

@@ -4,7 +4,7 @@
* 代码修订:yitter
* 开源地址:https://gitee.com/yitter/idgenerator
*/
package contract
package idgen

type IIdGenerator interface {
NewLong() uint64

Go/source/contract/ISnowWorker.go → Go/source/idgen/ISnowWorker.go View File

@@ -4,7 +4,7 @@
* 代码修订:yitter
* 开源地址:https://gitee.com/yitter/idgenerator
*/
package contract
package idgen

type ISnowWorker interface {
NextId() uint64

Go/source/contract/IdGeneratorException.go → Go/source/idgen/IdGeneratorException.go View File

@@ -4,7 +4,7 @@
* 代码修订:yitter
* 开源地址:https://gitee.com/yitter/idgenerator
*/
package contract
package idgen

import "fmt"


Go/source/contract/IdGeneratorOptions.go → Go/source/idgen/IdGeneratorOptions.go View File

@@ -4,7 +4,7 @@
* 代码修订:yitter
* 开源地址:https://gitee.com/yitter/idgenerator
*/
package contract
package idgen

type IdGeneratorOptions struct {
Method uint16 // 雪花计算方法,(1-漂移算法|2-传统算法),默认1

Go/source/contract/OverCostActionArg.go → Go/source/idgen/OverCostActionArg.go View File

@@ -4,7 +4,7 @@
* 代码修订:yitter
* 开源地址:https://gitee.com/yitter/idgenerator
*/
package contract
package idgen

type OverCostActionArg struct {
ActionType int32

Go/source/core/snowWorkerM1.go → Go/source/idgen/SnowWorkerM1.go View File

@@ -4,14 +4,14 @@
* 代码修订:yitter
* 开源地址:https://gitee.com/yitter/idgenerator
*/
package core
package idgen

import (
"sync"
"time"
"yitidgen/contract"
)

// SnowWorkerM1 .
type SnowWorkerM1 struct {
BaseTime int64 //基础时间
WorkerId uint16 //机器码
@@ -32,7 +32,8 @@ type SnowWorkerM1 struct {
sync.Mutex
}

func NewSnowWorkerM1(options *contract.IdGeneratorOptions) contract.ISnowWorker {
// NewSnowWorkerM1 .
func NewSnowWorkerM1(options *IdGeneratorOptions) ISnowWorker {
var workerIdBitLength byte
var seqBitLength byte
var maxSeqNumber uint32
@@ -63,8 +64,10 @@ func NewSnowWorkerM1(options *contract.IdGeneratorOptions) contract.ISnowWorker
} else {
baseTime = 1582136402000
}

timestampShift := (byte)(options.WorkerIdBitLength + options.SeqBitLength)
currentSeqNumber := options.MinSeqNumber

return &SnowWorkerM1{
BaseTime: baseTime,
WorkerId: workerId,
@@ -77,7 +80,8 @@ func NewSnowWorkerM1(options *contract.IdGeneratorOptions) contract.ISnowWorker
_CurrentSeqNumber: currentSeqNumber}
}

func (m1 *SnowWorkerM1) DoGenIdAction(arg *contract.OverCostActionArg) {
// DoGenIDAction .
func (m1 *SnowWorkerM1) DoGenIdAction(arg *OverCostActionArg) {

}

@@ -128,10 +132,12 @@ func (m1 *SnowWorkerM1) NextOverCostId() uint64 {

return m1.CalcId(m1._LastTimeTick)
}

m1._GenCountInOneTerm++
return m1.CalcId(m1._LastTimeTick)
}

// NextNormalID .
func (m1 *SnowWorkerM1) NextNormalId() uint64 {
currentTimeTick := m1.GetCurrentTimeTick()
if currentTimeTick < m1._LastTimeTick {
@@ -145,7 +151,8 @@ func (m1 *SnowWorkerM1) NextNormalId() uint64 {
}
m1.BeginTurnBackAction(m1._TurnBackTimeTick)
}
time.Sleep(time.Duration(10) * time.Millisecond)

time.Sleep(time.Duration(1) * time.Millisecond)
return m1.CalcTurnBackId(m1._TurnBackTimeTick)
}
// 时间追平时,_TurnBackTimeTick清零
@@ -169,26 +176,31 @@ func (m1 *SnowWorkerM1) NextNormalId() uint64 {

return m1.CalcId(m1._LastTimeTick)
}

return m1.CalcId(m1._LastTimeTick)
}

// CalcID .
func (m1 *SnowWorkerM1) CalcId(useTimeTick int64) uint64 {
result := uint64(useTimeTick<<m1._TimestampShift) + uint64(m1.WorkerId<<m1.SeqBitLength) + uint64(m1._CurrentSeqNumber)
m1._CurrentSeqNumber++
return result
}

// CalcTurnBackID .
func (m1 *SnowWorkerM1) CalcTurnBackId(useTimeTick int64) uint64 {
result := uint64(useTimeTick<<m1._TimestampShift) + uint64(m1.WorkerId<<m1.SeqBitLength) + uint64(m1._TurnBackIndex)
m1._TurnBackTimeTick--
return result
}

// GetCurrentTimeTick .
func (m1 *SnowWorkerM1) GetCurrentTimeTick() int64 {
var millis = time.Now().UnixNano() / 1e6
return millis - m1.BaseTime
}

// GetNextTimeTick .
func (m1 *SnowWorkerM1) GetNextTimeTick() int64 {
tempTimeTicker := m1.GetCurrentTimeTick()
for tempTimeTicker <= m1._LastTimeTick {
@@ -197,6 +209,7 @@ func (m1 *SnowWorkerM1) GetNextTimeTick() int64 {
return tempTimeTicker
}

// NextId .
func (m1 *SnowWorkerM1) NextId() uint64 {
m1.Lock()
defer m1.Unlock()

Go/source/core/snowWorkerM2.go → Go/source/idgen/SnowWorkerM2.go View File

@@ -4,19 +4,18 @@
* 代码修订:yitter
* 开源地址:https://gitee.com/yitter/idgenerator
*/
package core
package idgen

import (
"fmt"
"strconv"
"yitidgen/contract"
)

type SnowWorkerM2 struct {
*SnowWorkerM1
}

func NewSnowWorkerM2(options *contract.IdGeneratorOptions) contract.ISnowWorker {
func NewSnowWorkerM2(options *IdGeneratorOptions) ISnowWorker {
return &SnowWorkerM2{
NewSnowWorkerM1(options).(*SnowWorkerM1),
}

+ 2
- 3
Go/source/idgen/YitIdHelper.go View File

@@ -8,7 +8,6 @@ package idgen

import (
"sync"
"yitidgen/contract"
)

//var yitIdHelper *YitIdHelper
@@ -50,7 +49,7 @@ type YitIdHelper struct {
// return yih.idGenInstance.NewLong()
//}

func SetIdGenerator(options *contract.IdGeneratorOptions) {
func SetIdGenerator(options *IdGeneratorOptions) {
singletonMutex.Lock()
idGenerator = NewDefaultIdGenerator(options)
singletonMutex.Unlock()
@@ -59,7 +58,7 @@ func SetIdGenerator(options *contract.IdGeneratorOptions) {
func NextId() uint64 {
if idGenerator == nil {
singletonMutex.Lock()
options := contract.NewIdGeneratorOptions(1)
options := NewIdGeneratorOptions(1)
idGenerator = NewDefaultIdGenerator(options)
singletonMutex.Unlock()
}


+ 4
- 10
Go/source/main.go View File

@@ -4,14 +4,13 @@ import (
"C"
"fmt"
"time"
"yitidgen/contract"
"yitidgen/idgen"
"yitidgen/regworkerid"
)

///export SetOptions
func SetOptions(workerId uint16) {
var options = contract.NewIdGeneratorOptions(workerId)
var options = idgen.NewIdGeneratorOptions(workerId)
idgen.SetIdGenerator(options)
}

@@ -44,23 +43,21 @@ func main() {

fmt.Println("注册的WorkerId:", regworkerid.RegisterWorkerId("localhost", 6379, "", 4))

return
// 方法二:自定义参数
var options = contract.NewIdGeneratorOptions(1)
var options = idgen.NewIdGeneratorOptions(1)
options.WorkerIdBitLength = 6
options.SeqBitLength = 6
options.TopOverCostCount = 2000
options.BaseTime = time.Date(2020, 2, 20, 2, 20, 2, 20, time.UTC).UnixNano() / 1e6
idgen.SetIdGenerator(options)

var genCount = 50000

for {
var begin = time.Now().UnixNano() / 1e6
var begin = time.Now().UnixNano() / 1e3
for i := 0; i < genCount; i++ {
idgen.NextId()
}
var end = time.Now().UnixNano() / 1e6
var end = time.Now().UnixNano() / 1e3

fmt.Println(end - begin)
time.Sleep(time.Duration(1000) * time.Millisecond)
@@ -70,6 +67,3 @@ func main() {

// go build -o target\yitidgengo.dll -buildmode=c-shared main.go

//var yid = idgen.YitIdHelper{}
//yid.SetIdGenerator(options)
//fmt.Println(yid.NextId())

BIN
Go/source/target/go_build_main_go.exe View File


BIN
Go/source/target/main.dll View File


+ 0
- 75
Go/source/target/main.h View File

@@ -1,75 +0,0 @@
/* Code generated by cmd/cgo; DO NOT EDIT. */

/* package command-line-arguments */


#line 1 "cgo-builtin-export-prolog"

#include <stddef.h> /* for ptrdiff_t below */

#ifndef GO_CGO_EXPORT_PROLOGUE_H
#define GO_CGO_EXPORT_PROLOGUE_H

#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
#endif

#endif

/* Start of preamble from import "C" comments. */




/* End of preamble from import "C" comments. */


/* Start of boilerplate cgo prologue. */
#line 1 "cgo-gcc-export-header-prolog"

#ifndef GO_CGO_PROLOGUE_H
#define GO_CGO_PROLOGUE_H

typedef signed char GoInt8;
typedef unsigned char GoUint8;
typedef short GoInt16;
typedef unsigned short GoUint16;
typedef int GoInt32;
typedef unsigned int GoUint32;
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;

/*
static assertion to make sure the file is being used on architecture
at least with matching size of GoInt.
*/
typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];

#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef _GoString_ GoString;
#endif
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

#endif

/* End of boilerplate cgo prologue. */

#ifdef __cplusplus
extern "C" {
#endif

extern __declspec(dllexport) GoUint64 NextId();

#ifdef __cplusplus
}
#endif

BIN
Go/source/target/yitidgen.dll View File


+ 0
- 75
Go/source/target/yitidgen.h View File

@@ -1,75 +0,0 @@
/* Code generated by cmd/cgo; DO NOT EDIT. */

/* package command-line-arguments */


#line 1 "cgo-builtin-export-prolog"

#include <stddef.h> /* for ptrdiff_t below */

#ifndef GO_CGO_EXPORT_PROLOGUE_H
#define GO_CGO_EXPORT_PROLOGUE_H

#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
#endif

#endif

/* Start of preamble from import "C" comments. */




/* End of preamble from import "C" comments. */


/* Start of boilerplate cgo prologue. */
#line 1 "cgo-gcc-export-header-prolog"

#ifndef GO_CGO_PROLOGUE_H
#define GO_CGO_PROLOGUE_H

typedef signed char GoInt8;
typedef unsigned char GoUint8;
typedef short GoInt16;
typedef unsigned short GoUint16;
typedef int GoInt32;
typedef unsigned int GoUint32;
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;

/*
static assertion to make sure the file is being used on architecture
at least with matching size of GoInt.
*/
typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];

#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef _GoString_ GoString;
#endif
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

#endif

/* End of boilerplate cgo prologue. */

#ifdef __cplusplus
extern "C" {
#endif

extern __declspec(dllexport) GoUint64 NextId();

#ifdef __cplusplus
}
#endif

BIN
Go/source/target/yitidgengo.dll View File


+ 0
- 83
Go/source/target/yitidgengo.h View File

@@ -1,83 +0,0 @@
/* Code generated by cmd/cgo; DO NOT EDIT. */

/* package command-line-arguments */


#line 1 "cgo-builtin-export-prolog"

#include <stddef.h> /* for ptrdiff_t below */

#ifndef GO_CGO_EXPORT_PROLOGUE_H
#define GO_CGO_EXPORT_PROLOGUE_H

#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef struct { const char *p; ptrdiff_t n; } _GoString_;
#endif

#endif

/* Start of preamble from import "C" comments. */




/* End of preamble from import "C" comments. */


/* Start of boilerplate cgo prologue. */
#line 1 "cgo-gcc-export-header-prolog"

#ifndef GO_CGO_PROLOGUE_H
#define GO_CGO_PROLOGUE_H

typedef signed char GoInt8;
typedef unsigned char GoUint8;
typedef short GoInt16;
typedef unsigned short GoUint16;
typedef int GoInt32;
typedef unsigned int GoUint32;
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
typedef __SIZE_TYPE__ GoUintptr;
typedef float GoFloat32;
typedef double GoFloat64;
typedef float _Complex GoComplex64;
typedef double _Complex GoComplex128;

/*
static assertion to make sure the file is being used on architecture
at least with matching size of GoInt.
*/
typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1];

#ifndef GO_CGO_GOSTRING_TYPEDEF
typedef _GoString_ GoString;
#endif
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

#endif

/* End of boilerplate cgo prologue. */

#ifdef __cplusplus
extern "C" {
#endif


// 注册一个新的WorkerId
extern __declspec(dllexport) GoInt RegisterWorkerId(char* ip, GoInt port, char* password, GoInt maxWorkerId);

// 注销WorkerId
extern __declspec(dllexport) void UnRegisterWorkerId();

// 检查本地WorkerId是否有效(0-有效,其它-无效)
extern __declspec(dllexport) GoInt ValidateLocalWorkerId(GoInt workerId);

#ifdef __cplusplus
}
#endif

+ 1
- 1
README.md View File

@@ -2,7 +2,7 @@
## 转载及版权声明
<font color="#11aaff" size="5">©</font> 本人从未在博客园之外的网站,发表过关于本算法的长文,其它网站上存在的介绍文章,均属他人拷贝之作。
<font color="#11aaff" size="5">©</font> 本人从未在博客园之外的网站,发表过本算法长文,其它网站所现文章,均属他人拷贝之作。
<font color="#11aaff" size="5">©</font> 所有拷贝之作,均须保留项目开源链接,否则禁止转载。


Loading…
Cancel
Save