本网站使用 Kohei Koyanagi 开发的软件自动翻译为多种语言。为确保准确,请参考原始 英文 版本。

Splync的双重标识符方法:UUID和自动递增整数

Splync对敏感ID使用两种标识符

在Splync的数据库中,每位用户和每个项目都有两个不同的ID:UUID和自动递增的整数。自动递增的整数是大多数人熟悉的——它就是一个计数器:1,2,3,依此类推。Splync在服务器数据库中使用这些整数来组织几乎每个表,因为它们简单、快速且高效。然而,我们从不向应用程序公开这些内部数字。例如,如果你是第42位注册用户,你在数据库中的内部ID就是42。但你的iOS应用程序从未见过“42”。相反,应用程序使用UUID来代表你。我们对项目采用相同的方法——一个项目ID在数据库中可能是“7”,但应用程序总是使用长UUID来引用它。

什么是UUID

UUID代表通用唯一标识符。Splync使用符合RFC 4122标准的版本4,变体1 UUID——这是最广泛采用的标准之一。它是一个随机生成的字符串,看起来像949ca11c-a6ed-48a3-b40a-fa9727494917。UUID通常写为32个十六进制字符,分为五个部分,并用连字符分隔。它旨在具有全球唯一性,意味着即使在不同的服务器或数据库中也不会碰撞。从数学上讲,有大约16^32 = 2^128种可能的组合。然而,由于有六个位保留用于指示变体和版本,版本4,变体1的UUID总数大约为2^122,或大约5.3 x 10^36——一个天文数字,确保了实际的唯一性。

1 / 5,300,000,000,000,000,000,000,000,000,000,000,000有多小

每对UUIDv4匹配的机会大约是5.3 × 10^36分之一。这个数字小到几乎无法在人的想象中存在。想象一下同时投掷47个骰子。每个骰子都显示“1”的几率大约是6^47分之一,也就是大约3.7 × 10^36分之一。这与UUID碰撞的数量级相同。现在,想象地球上每个人——大约80亿人——每毫秒投掷这47个骰子,持续一万亿年。这大约是2.5 × 10^32次尝试。即便如此,某人某地同时得到47个1的机会仍然只有万分之一。这就是两个UUIDv4碰撞的可能性。这不是“罕见”,而是宇宙般荒谬的巧合,足以让数学家们放下咖啡,检查宇宙是否出错。

生成UUID容易吗

乍一看,生成UUID似乎很简单——毕竟,它只是一个看起来随机的字母数字字符串。但尝试用笔和纸自己写一个。你当然可以写下36个字符,但如果你重复数千次,明显的模式会出现。也许你偏爱某些数字,比如3或8,很少使用x这样的字母。计算机可以立即检测到这些偏好。恶意黑客可以分析你的习惯,在一天内缩小你的“随机”秘密字符串的范围。那么,如果你也转向计算机并调用rand()这个经典随机函数来生成每个数字。这是更好的,但还不够好。许多常见编程环境中的“随机”数生成器是伪随机的,这意味着它们遵循从内部种子开始的可预测数学序列,而该种子通常基于系统时间。如果有人发现或猜测了该种子,他们可以重现你的生成器曾经产生的每个值。

UUID有多随机

完美的随机性并不存在——就像不存在完美的骰子或完美随机的骰子投掷一样。每个物理或数字过程都有一些潜在的规则。尽管如此,数学家和工程师们花了几十年时间设计尽可能接近真正随机性的算法。当Splync创建一个新的版本4 UUID时,它并不是简单地“随机选择数字”,像掷骰子一样。它向操作系统请求微小的不可预测性痕迹——例如,你的CPU完成任务的精确时刻,硬件内部的微弱电子噪声,或内存中的背景时间波动。这些熵的片段被收集并混合成128位数据——一个长序列的0和1。结果是一个几乎不可能被应用用户或潜在的恶意攻击者猜测或重现的代码。

Splync的双重标识符方法

Splync对用户ID和项目ID等敏感标识符使用UUID,因为它们极其随机和安全。同时,在其服务器内,Splync将这些UUID转换为自动递增的整数,以便对大型数据集进行更快的搜索和分析。这种双重标识符方法在安全性和便利性之间取得了平衡——外部隐私与内部性能。Splync的目标是成为一个无压力、简单且安全的预算跟踪应用程序。在可见的用户界面背后,我们不断完善我们的架构,以保持其平稳、安全和默默的智能。