首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MySQL生成一个非顺序的、仅为整数的UUID的最快方法?

问用MySQL生成一个非顺序的、仅为整数的UUID的最快方法?
EN

Stack Overflow用户
提问于 2021-12-20 20:47:06
回答 1查看 88关注 0票数 0

我正在尝试使用non-sequential,整数生成只使用MySQL的UUID,并提供尽可能好的性能。

我知道MySQL已经提供了各种方法来生成一个可靠的UUID:

  • UUID v4:很大的唯一性,但慢的作为UUID类型存储
  • UUID v1:类似的,但可以是连续的,稍微提高索引性能
  • 肖特():最好的性能,更短,存储在64位大INT上,但连续的

然而,这些解决方案都没有提供非顺序(它将公开显示,我不希望用户能够跟踪增长/增量)和整数-只有UUID(为了性能)。

使用RAND()是不可能的,因为碰撞过高,甚至对于<100 K记录也是如此。

除了将UUID_V1转换为十进制之外,还有其他聪明的解决方案吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-21 00:24:45

你的问题首先是数学问题,然后是编程问题。

我会考虑简单的:M = (M + N) % (2^32)来获得M的"next“值。

其中N是一个大的,正的,奇数的整数。

M是要使用的下一个数字。(它可以用任何你喜欢的东西初始化)。

它将生成2^32个不同的数字,然后重复。

2^32可以是2的任意幂。实际上,关键是2^32和N没有共同的因素(除了1)。

小心%;您使用的语言可能使用32位有符号数字。或者64位。在今天的大多数语言中,2^16将起作用。但它限制了你65536的数值。

% 2^P也可以使用位掩蔽来完成。

Rand()只在2^30值之后重复,但是RAND() * 99999很可能在前99999次迭代中有一些dups。有一些随机数发生器可以持续更长的时间。

1M值约为20位。所以2^20起作用了。或者用& 0xFFFFF掩蔽。

如果您也转换为十六进制,那么所有的代码可以是5个字符。TO_BASE64()将其压缩为4个字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70427846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档