Acerca de la 'identificación única global'


Comparación entre UUID y Snowflake


Cuando necesite garantizar una identificación única a nivel mundial, puede elegir UUID o Snowflake (y sus variantes)

Entre ellos, UUID no depende de ningún sistema de terceros y tiene mejor rendimiento y usabilidad;

Los ID generados por Snowflake aumentan monótonamente (puede obtener información de marca de tiempo cuando se genera) y pueden contener ciertos significados comerciales (como la duración del tiempo de registro). Es mejor usar Snowflake cuando se trata de tablas de fragmentación.

alternativo

En términos de ocupación de espacio en la base de datos, Snowflake divide los números binarios de 64 bits en varias partes, por lo que si se almacena en tipo int, el máximo es 9223372036854775807, que no excede el límite superior de int64, como 1628304129979846657.


alternativo

La composición de uuid [1]

El UUID es una cadena de 32 dígitos hexadecimales, como cd7460be-1593-41b1-9542-2b9a690f9dd2.

Demostración del algoritmo de copo de nieve:

package main

import (
   "fmt"

   "github.com/bwmarrin/snowflake"
)

func main() {

   // Create a new Node with a Node number of 1
   node, err := snowflake.NewNode(1)
   if err != nil {
      fmt.Println(err)
      return
   }

   // Generate a snowflake ID.
   id := node.Generate()

   // Print out the ID in a few different ways.
   fmt.Printf("Int64  ID: %d\n", id)
   fmt.Printf("String ID: %s\n", id)
   fmt.Printf("Base2  ID: %s\n", id.Base2())
   fmt.Printf("Base64 ID: %s\n", id.Base64())

   // Print out the ID's timestamp
   fmt.Printf("ID Time  : %d\n", id.Time())

   // Print out the ID's node number
   fmt.Printf("ID Node  : %d\n", id.Node())

   // Print out the ID's sequence number
   fmt.Printf("ID Step  : %d\n", id.Step())

   // Generate and print, all in one.
   fmt.Printf("ID       : %d\n", node.Generate().Int64())
}

Producción:

Int64  ID: 1628304129979846656
String ID: 1628304129979846656
Base2  ID: 1011010011000111001011111101010100101110000000001000000000000
Base64 ID: MTYyODMwNDEyOTk3OTg0NjY1Ng==
ID Time  : 1677052931672
ID Node  : 1
ID Step  : 0
ID       : 1628304129979846657

Demostración de UUID:

package main

import (
   "fmt"

   "github.com/satori/go.uuid"
)

func main() {
   // Creating UUID Version 4
   // panic on error
   u1 := uuid.Must(uuid.NewV4(), nil)
   fmt.Printf("UUIDv4: %s\n", u1)

   // or error handling
   u2 := uuid.NewV4()
   fmt.Printf("UUIDv4: %s\n", u2)

   // Parsing UUID from string input
   u2, err := uuid.FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
   if err != nil {
      fmt.Printf("Something went wrong: %s", err)
      return
   }
   fmt.Printf("Successfully parsed: %s", u2)
}

Producción:

UUIDv4: cd7460be-1593-41b1-9542-2b9a690f9dd2
UUIDv4: 2c598a64-e685-4ab2-9021-9aa352aaefad
Successfully parsed: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

UUID


alternativo


Identificador universalmente único (inglés: Universally Unique Identifier, abreviatura: UUID) [2]


UUID es un estándar definido por la Open Software Foundation (OSF), y GUID es la implementación de Microsoft del estándar UUID y actualmente se adopta ampliamente. Existen otras implementaciones de UUID, no solo GUID.

El uuid generado se compone de un conjunto de números hexadecimales de 32 dígitos, por lo que el número total teórico de uuid es 16 elevado a 32, es decir, 2 elevado a 128, que es aproximadamente igual a 3,4 x 10 elevado a 38 . . En otras palabras, si se genera 1 billón de UUID cada nanosegundo (ns), se necesitarán 10 mil millones de años para agotar todos los UUID.

La forma estándar de UUID contiene 32 dígitos hexadecimales, divididos en cinco segmentos con guiones y tiene un formato de 32 caracteres de 8-4-4-4-12 . Ejemplo:

550e8400-e29b-41d4-a716-446655440000

Reglas de codificación UUID:

  • 1)1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的惟一性;
  • 2)9~16位采用底层的IP地址,在服务器集群中的惟一性;
  • 3)17~24位采用当前对象的HashCode值,在一个内部对象上的惟一性;
  • 4)25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的惟一性。

通过以上4种策略可以保证惟一性。在系统中需要用到随机数的地方都可以考虑采用UUID算法。


最知名的标准是RFC4122[3]

很有意思的是这个标准没有第二版[4]

alternativo

uuid现在共有5个版本,版本1不够安全,版本4有可能发生重复,但概率极低.现在大多使用uuid4

UUID 不同版本的区别及选择[5]

alternativo

UUID4发生碰撞的概率:

alternativo

go版常用实现 uuid-rs/uuid[6]

alternativo

rust版常用实现 uuid-rs/uuid[7]

alternativo
alternativo

Twitter的Snowflake算法


[UUID和雪花(Snowflake)算法该如何选择?](https://cloud.tencent.com/developer/article/1766264 "UUID和雪花(Snowflake "UUID和雪花(Snowflake)算法该如何选择?")算法该如何选择?")

分布式ID生成方案--雪花算法和UUID对比[8]

几种分布式id生成方式[9]


其他方案实现「分布式环境下的全局唯一发号器」


图解各路分布式ID生成算法[10]

六种方式实现全局唯一发号器[11]

面试总被问分布式ID? 美团(Leaf)了解一下[12]

美团技术分享:深度解密美团的分布式ID生成算法[13]

面试总被问分布式ID怎么办? 滴滴(Tinyid)甩给他[14]


参考资料

[1]

uuid的组成: https://www.google.com/search?q=uuid&newwindow=1&sxsrf=AJOqlzW1mf2ohYNWjOwjuSh70Di0-aYINg:1677053193032&source=lnms&tbm=isch&sa=X&ved=2ahUKEwii7Nv-1aj9AhVNNt4KHQ7rCmQQ_AUoAXoECAEQAw&biw=1920&bih=990&dpr=1.8

[2]

通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID): https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81

[3]

RFC4122: https://segmentfault.com/a/1190000000484508

[4]

没有第二版: https://docs.python.org/zh-cn/3.11/library/uuid.html

[5]

UUID 不同版本的区别及选择: https://www.jianshu.com/p/76e3a75605ed

[6]

uuid-rs/uuid: https://github.com/satori/go.uuid

[7]

uuid-rs/uuid: https://github.com/uuid-rs/uuid

[8]

分布式ID生成方案--雪花算法和UUID对比: https://blog.csdn.net/qq_40950903/article/details/108589837

[9]

几种分布式id生成方式: https://www.cnblogs.com/kuotian/p/12869914.html

[10]

图解各路分布式ID生成算法: https://i6448038.github.io/2019/09/28/snowflake/

[11]

六种方式实现全局唯一发号器: https://blog.csdn.net/qq_20051535/article/details/120072174

[12]

面试总被问分布式ID? 美团(Leaf)了解一下: https://juejin.im/post/5e61b4f26fb9a07cb83e2eee

[13]

美团技术分享:深度解密美团的分布式ID生成算法: https://zhuanlan.zhihu.com/p/83753710

[14]

¿Qué debo hacer si siempre me preguntan sobre la identificación distribuida durante las entrevistas? Didi (Tinyid) lo dejó: https://cloud.tencent.com/developer/article/1598569

Este artículo está publicado por mdnice multiplataforma.

Supongo que te gusta

Origin blog.csdn.net/techdashen/article/details/132909672
Recomendado
Clasificación