guid.go

package nsqd

// the core algorithm here was borrowed from:
// Blake Mizerany‘s `noeqd` https://github.com/bmizerany/noeqd
// and indirectly:
// Twitter‘s `snowflake` https://github.com/twitter/snowflake

// only minor cleanup and changes to introduce a type, combine the concept
// of workerID + datacenterId into a single identifier, and modify the
// behavior when sequences rollover for our specific implementation needs

import (
    "encoding/hex"
    "errors"
    "time"
)

const (
    workerIDBits   = uint64(10)
    sequenceBits   = uint64(12)
    workerIDShift  = sequenceBits
    timestampShift = sequenceBits + workerIDBits
    sequenceMask   = int64(-1) ^ (int64(-1) << sequenceBits)

    // ( 2012-10-28 16:23:42 UTC ).UnixNano() >> 20
    twepoch = int64(1288834974288)
)

var ErrTimeBackwards = errors.New("time has gone backwards")
var ErrSequenceExpired = errors.New("sequence expired")
var ErrIDBackwards = errors.New("ID went backward")

type guid int64

type guidFactory struct {
    sequence      int64
    lastTimestamp int64
    lastID        guid
}

func (f *guidFactory) NewGUID(workerID int64) (guid, error) {
    // divide by 1048576, giving pseudo-milliseconds
    ts := time.Now().UnixNano() >> 20

    if ts < f.lastTimestamp {
        return 0, ErrTimeBackwards
    }

    if f.lastTimestamp == ts {
        f.sequence = (f.sequence + 1) & sequenceMask
        if f.sequence == 0 {
            return 0, ErrSequenceExpired
        }
    } else {
        f.sequence = 0
    }

    f.lastTimestamp = ts

    id := guid(((ts - twepoch) << timestampShift) |
        (workerID << workerIDShift) |
        f.sequence)

    if id <= f.lastID {
        return 0, ErrIDBackwards
    }

    f.lastID = id

    return id, nil
}

func (g guid) Hex() MessageID {
    var h MessageID
    var b [8]byte

    b[0] = byte(g >> 56)
    b[1] = byte(g >> 48)
    b[2] = byte(g >> 40)
    b[3] = byte(g >> 32)
    b[4] = byte(g >> 24)
    b[5] = byte(g >> 16)
    b[6] = byte(g >> 8)
    b[7] = byte(g)

    hex.Encode(h[:], b[:])
    return h
}
				
时间: 2024-12-28 01:41:17

guid.go的相关文章

GuId为空的判断

随着学习的深入和项目开发的需求的变化,接触到了GuId.它是业界大亨微软使用的,通过一种复杂的算法生成,该算法保证所有的COM对象都有着唯一的ID,而不会出现名字冲突.保证了我们在大数据量的开发中标识唯一. Guid适用于多平台.多领域,给我们的开发带来的诸多的方便,同时也避免了开发中很多的问题,自己也是感同身受!但在对Guid为空的判断时却遇到了问题,网上找了很多的资料有各种各样的解决方案,但是并不是很适用于自己的情况,下面就将自己的办法分享给大家,希望可以惠及到更多的人! 由于Guid返回的

Hyper-V 通过GUID查找 虚拟机名字

Hyper-V是微软的虚拟化平台,笔者在使用的过程中偶尔会遇到虚拟机不稳定的状态(如一直 Stopping和Starting,以及其他未知状态) .笔者对此的解决办法是直接上大招结束进程,但是在任务管理中发现这些虚拟机都是用GUID命名的. 如何才能找到虚拟机对应的GUID呢?笔者总结了两个办法: 方法一: 通过Console界面打开虚拟机,在任务管理器中观察GUID和虚拟机名字的关系. ""WAMP"就是虚拟机的名字,-G 后面的参数就是GUID,然后结束对应的Virtua

UniqueIdentifier 数据类型 和 GUID 生成函数

UniqueIdentifier 数据类型用于存储GUID的值,占用16Byte. SQL Server将UniqueIdentifier存储为16字节的二进制数值,Binary(16),按照特定的格式显示,显示的格式是:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中,x是16进制数字,数值范围是从0-9,A-F.由于每个字节存储2个16进制数据,因此,按照存储字节,UniqueIdentifier的格式简写为:4B-2B-2B-2B-6B.使用GUID的好处是:

关于GUID的相关知识

GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可能的数字.GUID的唯一缺陷在于生成的结果串会比较大.” 1.         一个GUID为一个128位的整数(16字节),在使用唯一标识符的情况下,你可以在所有计算机和网络之间使用这一整数. 2.         GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxx

什么是GUID?

定义及格式 1.全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID. 2.GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个4位十六进制数.例如:6F9619FF-8B86-D011-B42D-00C

跨平台生成GUID/UUID

#ifndef XGUID_H#define XGUID_H #include <string>#include <stdio.h>#ifdef WIN32#include <objbase.h>#else#include <uuid/uuid.h> typedef struct _GUID{    unsigned long Data1;    unsigned short Data2;    unsigned short Data3;    unsign

GUID介绍

GUID介绍 GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值. 世界上的任何两台计算机都

sharepoint powershell 根据报错的GUID查询错误

打开sharepoint powershell Get-splogevent | ?{$_.Correlation -eq "GUID"}  | select Area,category,Level,EventID,Message | Format-List > c:\errlog.txt 把GUID替换成爆出错误的GUID

ASP.NET中GUID类

GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值. 世界上的任何两台计算机都不会生成重复的

SQL Server报“GUID应包含带4个短划线的32位数”

转自:http://www.seayee.net/article/info_106.html 最近在配置一台服务器的MS SQL Server 2005的维护计划自动备份数据库,能创建维护计划,但设置了运行时间后,保存就提示“GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)”错误,很不爽! 上网看看有没有解决办法吧,首先查到的是微软的帮助和支持的一篇<当您试图保存 SQL Server 管理 Studio 中的维护计划时的