生成一个唯一的id?

1u4esq0p  于 2021-06-14  发布在  Cassandra
关注(0)|答案(4)|浏览(583)

我正在研究一个分布式数据库。我正在尝试生成一个唯一的id,它将作为cassandra中的列族主键。
我读了一些关于用java实现这一点的文章 UUID 但似乎有发生碰撞的可能性(即使很低)。
我想知道是否有一种方法可以根据时间生成一个唯一的id?

kxeu7u2r

kxeu7u2r1#

你应该调查使用twitter雪花。从项目自述:
随着twitter从mysql转向cassandra,我们需要一种新的方法来生成身份证号码。Cassandra没有顺序id生成设施,也不应该有。
snowflake使用了一种直观的算法,它可以生成时间顺序和唯一的long。因为您的数据库是分布式的,所以这个服务应该很适合您的需要。

mf98qq94

mf98qq942#

正如richard所说,可以使用timeuuid,生成timeuuid值并不是什么大事。只需关注Cassandra常见问题解答。

6gpjuf90

6gpjuf903#

你需要使用Cassandra函数 now() 生成timeuuid并使用 uuid() 函数生成uuid类型字符串。

gijlo24d

gijlo24d4#

你可以用 TimeUUID 输入cassandra,它支持类型1的uuid。它使用当前时间、创建者的mac地址和序列号。如果timeuuid号生成正确,这可以在零冲突的情况下完成(您可以使用cql now() 方法或插入自己的,JavaSDK提供了一些线程安全的实现)。主要优势 TimeUUIDs ID可以按时间排序。看到了吗http://wiki.apache.org/cassandra/timebaseuuidnotes 更多信息。
但是,时间顺序对于行主键不太可能有用,因为在使用哈希分区器时,时间顺序是无用的,尽管可以使用集群键。而且,如果你自己动手,生成一个唯一id的复杂性也可能是一个bug的来源。cassandra还通过使用 UUID 类型。这些都是随机的。碰撞概率是存在的,但是碰撞概率(假设不相关的随机数源,如果用java生成的话就是这样)是非常低的——如果你在100年内每秒创造10亿次,那么一次碰撞的概率大约是50%(看到了吗http://en.wikipedia.org/wiki/universally_unique_identifier#random_uuid_probability_of_duplicates 更多细节。)

相关问题