我想生成一长串 9 位数字序列。
我们称他们为 ID。
所以每个 ID 都是独一无二的,主要目的是让它们都真正不同。不能接受有 2 个 ID 顺序相差 1 或 2 个数字。
您是否有任何想法如何在不将每个新生成的 ID 与每个先前生成的 ID 进行比较的情况下实现它?
可能已经有一些算法或简单的 MYSQL 函数来比较这些字符串的接近程度?
您可以为您的 ID 尝试以下公式 - 您只需要检查 ID 值是否已存在于表中(salt
是一个常数,0
一旦100
您选择一个值就不会改变 - 我建议使用一个素数,绝对不是0
):
ID = random integer * 101 + salt;
这会生成如下 ID 值(对于salt = 73
):
469956305
017775467
001195913
913620520
156482807
577463533
470183959
049290800
078643925
141526626
如果您取其中任意两个 ID 值并比较它们,您会注意到没有两个数字在序列上仅相差一位或两位数。我编写了一个脚本来比较 和 之间所有可能的 ID 值0
,3000000
并且没有两个这种形式的 ID 值按顺序相差 1 或 2 个数字。如果您想自己测试一下,这是我使用的脚本(在 C# 中):http: //ideone.com/lFHnlX - 由于 IDEone 超时,我降低了上限。
您想避免不检查唯一性并且不希望 ID 相似吗?那么你真的在寻找UUIDs / GUIDs。
MySQL 的内置uuid()
函数将带您到那里。
正如 Robert Harvey 指出的那样,UUID 是字母数字(不是数字)并且长度超过 9 个字符,但是您将不得不牺牲一些东西——您不能同时满足所有约束。