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

某网站建设策划方案鞍山做网站

某网站建设策划方案,鞍山做网站,石家庄专业建站公司,企业局域网ObjectID介绍 MongoDB中的ObjectId是一种特殊的12字节 BSON 类型数据#xff0c;用于为主文档提供唯一的标识符#xff0c;默认情况下作为 _id 字段的默认值出现在每一个MongoDB集合中的文档中。以下是ObjectId的具体组成#xff1a; 1. 时间戳#xff08;Timestamp… ObjectID介绍 MongoDB中的ObjectId是一种特殊的12字节 BSON 类型数据用于为主文档提供唯一的标识符默认情况下作为 _id 字段的默认值出现在每一个MongoDB集合中的文档中。以下是ObjectId的具体组成 1. 时间戳Timestamp 前4个字节32位表示创建该ObjectId时的Unix时间戳精确到秒从1970年1月1日UTC时间零点开始计算这使得ObjectId具有一定程度的时间有序性。 2. 机器标识符Machine ID 接下来的3个字节24位代表了生成此ObjectId的机器主机的唯一标识符。这个标识符通常是基于主机的网络接口地址哈希得到的目的是确保不同主机生成的ObjectId是不同的。 3. 进程标识符PID 旧版描述中提到的是进程ID但在MongoDB较新版本中已不再使用在某些早期的描述中提及2个字节代表进程ID不过实际上MongoDB并不使用进程ID来生成ObjectId以避免因为PID重用导致的冲突。现在这部分数据通常用于其他目的以保证全局唯一性。 4. 计数器Counter 最后的3个字节24位是一个自增计数器在同一台机器同一秒内生成的ObjectId会通过这个计数器递增来确保唯一性。计数器在一个秒内是从一个随机数开始递增的这样即使在同一秒内创建多个ObjectId也能保证在单机上的唯一性。 因此ObjectId的设计可以确保在分布式的环境下每个文档都能拥有一个全局唯一的标识符同时也包含了时间信息这对于很多应用场景来说非常有用比如排序、索引和逻辑处理。 ObjectID使用 分布式系统需要全局唯一ID且有序的可以考虑ObjectID。 UUID太长了且是无序的。感觉不太好ObjectID算是个还可以的选择。当然还有很多其它方案。 Go项目在Mongodb的驱动包里有一个文件是objectid.go有写好ObjectID生成算法。如果项目只要一个算法没必要引入完整的包可以直接把这个文件拷贝出来。 内容如下 package hobjectidimport (crypto/randencodingencoding/binaryencoding/hexencoding/jsonerrorsfmtiosync/atomictime )// 代码来自 https://github.com/mongodb/mongo-go-driver/blob/v1/bson/primitive/objectid.go// ErrInvalidHex indicates that a hex string cannot be converted to an ObjectID. var ErrInvalidHex errors.New(the provided hex string is not a valid ObjectID)// ObjectID is the BSON ObjectID type. type ObjectID [12]byte// NilObjectID is the zero value for ObjectID. var NilObjectID ObjectIDvar objectIDCounter readRandomUint32() var processUnique processUniqueBytes()var _ encoding.TextMarshaler ObjectID{} var _ encoding.TextUnmarshaler ObjectID{}// NewObjectID generates a new ObjectID. func NewObjectID() ObjectID {return NewObjectIDFromTimestamp(time.Now()) }// NewObjectIDFromTimestamp generates a new ObjectID based on the given time. func NewObjectIDFromTimestamp(timestamp time.Time) ObjectID {var b [12]bytebinary.BigEndian.PutUint32(b[0:4], uint32(timestamp.Unix()))copy(b[4:9], processUnique[:])putUint24(b[9:12], atomic.AddUint32(objectIDCounter, 1))return b }// Timestamp extracts the time part of the ObjectId. func (id ObjectID) Timestamp() time.Time {unixSecs : binary.BigEndian.Uint32(id[0:4])return time.Unix(int64(unixSecs), 0).UTC() }// Hex returns the hex encoding of the ObjectID as a string. func (id ObjectID) Hex() string {var buf [24]bytehex.Encode(buf[:], id[:])return string(buf[:]) }func (id ObjectID) String() string {return fmt.Sprintf(ObjectID(%q), id.Hex()) }// IsZero returns true if id is the empty ObjectID. func (id ObjectID) IsZero() bool {return id NilObjectID }// ObjectIDFromHex creates a new ObjectID from a hex string. It returns an error if the hex string is not a // valid ObjectID. func ObjectIDFromHex(s string) (ObjectID, error) {if len(s) ! 24 {return NilObjectID, ErrInvalidHex}var oid [12]byte_, err : hex.Decode(oid[:], []byte(s))if err ! nil {return NilObjectID, err}return oid, nil }// IsValidObjectID returns true if the provided hex string represents a valid ObjectID and false if not. // // Deprecated: Use ObjectIDFromHex and check the error instead. func IsValidObjectID(s string) bool {_, err : ObjectIDFromHex(s)return err nil }// MarshalText returns the ObjectID as UTF-8-encoded text. Implementing this allows us to use ObjectID // as a map key when marshalling JSON. See https://pkg.go.dev/encoding#TextMarshaler func (id ObjectID) MarshalText() ([]byte, error) {return []byte(id.Hex()), nil }// UnmarshalText populates the byte slice with the ObjectID. Implementing this allows us to use ObjectID // as a map key when unmarshalling JSON. See https://pkg.go.dev/encoding#TextUnmarshaler func (id *ObjectID) UnmarshalText(b []byte) error {oid, err : ObjectIDFromHex(string(b))if err ! nil {return err}*id oidreturn nil }// MarshalJSON returns the ObjectID as a string func (id ObjectID) MarshalJSON() ([]byte, error) {return json.Marshal(id.Hex()) }// UnmarshalJSON populates the byte slice with the ObjectID. If the byte slice is 24 bytes long, it // will be populated with the hex representation of the ObjectID. If the byte slice is twelve bytes // long, it will be populated with the BSON representation of the ObjectID. This method also accepts empty strings and // decodes them as NilObjectID. For any other inputs, an error will be returned. func (id *ObjectID) UnmarshalJSON(b []byte) error {// Ignore null to keep parity with the standard library. Decoding a JSON null into a non-pointer ObjectID field// will leave the field unchanged. For pointer values, encoding/json will set the pointer to nil and will not// enter the UnmarshalJSON hook.if string(b) null {return nil}var err errorswitch len(b) {case 12:copy(id[:], b)default:// Extended JSONvar res interface{}err : json.Unmarshal(b, res)if err ! nil {return err}str, ok : res.(string)if !ok {m, ok : res.(map[string]interface{})if !ok {return errors.New(not an extended JSON ObjectID)}oid, ok : m[$oid]if !ok {return errors.New(not an extended JSON ObjectID)}str, ok oid.(string)if !ok {return errors.New(not an extended JSON ObjectID)}}// An empty string is not a valid ObjectID, but we treat it as a special value that decodes as NilObjectID.if len(str) 0 {copy(id[:], NilObjectID[:])return nil}if len(str) ! 24 {return fmt.Errorf(cannot unmarshal into an ObjectID, the length must be 24 but it is %d, len(str))}_, err hex.Decode(id[:], []byte(str))if err ! nil {return err}}return err }func processUniqueBytes() [5]byte {var b [5]byte_, err : io.ReadFull(rand.Reader, b[:])if err ! nil {panic(fmt.Errorf(cannot initialize objectid package with crypto.rand.Reader: %w, err))}return b }func readRandomUint32() uint32 {var b [4]byte_, err : io.ReadFull(rand.Reader, b[:])if err ! nil {panic(fmt.Errorf(cannot initialize objectid package with crypto.rand.Reader: %w, err))}return (uint32(b[0]) 0) | (uint32(b[1]) 8) | (uint32(b[2]) 16) | (uint32(b[3]) 24) }func putUint24(b []byte, v uint32) {b[0] byte(v 16)b[1] byte(v 8)b[2] byte(v) }使用生成算法生成的ID 可以与环境无关、业务无关。通用性更好。
http://www.w-s-a.com/news/255863/

相关文章:

  • 可以接项目做的网站网站源码php
  • 杭州广众建设工程有限公司网站网页游戏人气排行榜
  • 上海网站开发建设最简单的网站代码
  • 东莞做网站建设免费网站建设案例
  • 莱州建设局网站wordpress的主题下载地址
  • 二级网站域名长沙企业关键词优化服务质量
  • 在家有电脑怎么做网站wordpress 入门主题
  • 什邡建设局网站sem推广是什么意思
  • 西安分类信息网站网站敏感关键词
  • 黑彩网站怎么做建设网站费用分析
  • 网站关键词选取的步骤和方法小程序商城哪家好排行榜
  • 儿童产品网站建设网站建设优化排名推广
  • 做网站的硬件无锡招标网官方网站
  • 做推送好用的网站合肥网站推广培训
  • 网站开发团队简介贵阳双龙区建设局网站
  • 新乡做网站公司哪家好wordpress侧边栏文件
  • 小白建站怎么撤销网站备案
  • 哪个网站做调查问卷赚钱短视频制作神器
  • 上海企业响应式网站建设推荐汕头网络优化排名
  • 怎么建立公司网站平台怎么将网站做成公司官网
  • 培训学校网站怎样快速建设网站模板
  • 建设电子商务网站论文云服务器安装wordpress
  • 做展板好的网站学校的网站开发过程
  • 宁波搭建网站价格西部数码网站正在建设中是什么意思
  • 吉林省建设项目招标网站苏州网络推广定制
  • 网站域名所有权证明引流推广接单
  • 做网站百度百科孟州网站建设
  • 服务网站建设企业广州模板建站系统
  • 怎么做属于自己的免费网站浏览器游戏网址
  • 上海城乡住房建设厅网站西安网站推广慧创科技