Mysql 为每行指定一个唯一的6位或9位数字

Mysql 为每行指定一个唯一的6位或9位数字,mysql,Mysql,是否可以仅使用MySQL为每一新行分配一个唯一的6位或9位数字 示例: id1 : 928524 id2 : 124952 id3 : 485920 ... ... 附言:我可以用php的rand()函数做到这一点,但我想要一个更好的方法。MySQL可以自己分配唯一的连续键。如果您不想使用rand(),可能这就是您的意思?我建议您手动将第一行的ID设置为100000,然后告诉数据库自动递增。下一行应该是100001,然后是100002,依此类推。每个都是唯一的。不知道为什么要这样做,但您必须使

是否可以仅使用MySQL为每一新行分配一个唯一的6位或9位数字

示例:

id1 : 928524
id2 : 124952
id3 : 485920
...
...

附言:我可以用php的
rand()
函数做到这一点,但我想要一个更好的方法。

MySQL可以自己分配唯一的连续键。如果您不想使用rand(),可能这就是您的意思?

我建议您手动将第一行的
ID
设置为100000,然后告诉数据库自动递增。下一行应该是100001,然后是100002,依此类推。每个都是唯一的。

不知道为什么要这样做,但您必须使用php的rand函数,查看它是否已经在数据库中,如果它是从头开始的,如果不是,则将其用于id。

基本上,您需要一个加密哈希,它保证不会对您的输入范围产生冲突。似乎没有人知道MD5的冲突行为,所以这里有一个算法可以保证没有:选择两个没有公约数的大数字M和N——它们可以是两个非常大的素数,或者
2**64
3**50
,或者其他什么。您将生成范围为0..M-1的数字。使用以下哈希函数:

H(k) = k*N (mod M)    
基本数论保证序列在0..M-1范围内没有碰撞。因此,只要表中的ID小于M,就可以使用此函数对它们进行散列,这样就有了不同的散列。如果使用无符号64位整数算术,则可以让
M=2**64
。然后N可以是任意奇数(我会选择足够大的值,以确保k*N>M),您可以免费获得作为算术溢出的模运算


我在评论中写了以下内容,但我最好在此重复:这不是实现访问保护的好方法。但是,如果M足够大,它确实会阻止人们对你的所有内容发出咕噜声。

你能使用自动增量列吗?不,这在我的情况下不是一个选项。@sans481对于rand,我只看到一个问题:如果数据库中已经存在这个数字怎么办?(它将不得不生成另一个……这需要时间,也许它可以自己完成,而无需我的干预:)?)嗨,约翰,没有办法自动这么做对不起。对于6位数字或9位数字,发生碰撞的可能性非常小,所以就这么做吧。如果有碰撞,你必须检查两三次,那么用户就感觉不到。嗨,托马斯,是的,你是对的,碰撞的可能性很小,我只是想知道是否有更好的方法。如果第一行有id“300”,我不希望下一行有id“301”。为什么?你有什么可能的理由?这是为了混淆吗?在我的例子中,每个用户都可以创建新页面,例如:domain.com/124859,我不希望用户只通过在页面中添加“1”来访问每个创建的页面。。。这就是为什么我需要随机ID。如果这是你所追求的,并且你不想冒冲突,考虑一个保证不会有短周期/冲突的密码散列;e、 例如,自动递增的页面ID的MD5HASH(加上一个salt以防止人们猜测)。这个用例建议您创建一个权限系统,而不是模糊的ID!我不想要那样的东西。如果第一行的ID为100000,我不希望下一行的ID为100001。那么,你能更精确地说明你想要什么吗?我网站上的每个注册用户都可以创建类似于:domain.com/928481的页面,我希望这些页面具有随机ID,以便其他人在没有链接的情况下无法访问它们。(使用自动递增,问题是下一行将=上一行+1,所以用户可以很容易地找到它们。)啊。卡皮切。您希望用户具有随机用户ID。嗯,你可能想考虑其他六位数的组合。毕竟,猜一百万分之一并不难。你加几个字母怎么样?我最好的建议是使用用户名,因为它可能更难猜测,或者可能是用户名的散列。无论如何,最好的解决方案是通过编程实现。这不是MySQL的一项功能,使用加扰的ID使人们无法按顺序下载您的所有内容是可以的,但使用它们来控制访问是一个坏主意。首先,用户在其页面上创建链接并单击该链接时,他们将向目标服务器公开其URL。模糊处理不能代替访问控制:使用身份验证。我以前做过,直到现在。我问这个问题是想看看是否有其他方法可以做到这一点。