2012-02-16 47 views
-2

是否有可能只与MySQL的一个独特的6或9位数字分配给每个新行。举一个独特的6或9位数字,以每行

例子:

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

P.S:我能做到这与PHP的rand()功能,但我希望有一个更好的办法。

+0

你可以使用自动增量列吗? – 2012-02-16 17:43:06

+0

不,这不是我的情况。 – John 2012-02-16 17:43:53

+0

'not rand()'的任何原因? – sgowd 2012-02-16 17:44:03

回答

0

MySQL可以自行分配唯一的连续密钥。如果你不想使用rand(),也许这就是你的意思?

+0

如果第一行的ID为“300”,我不希望下一行的ID为“301”。 – John 2012-02-16 17:45:56

+0

为什么?你有什么可能的原因呢?这是为了混淆吗? – 2012-02-16 17:48:33

+0

就我而言,每个用户都可以创建新页面,例如:domain。com/124859,我不希望用户通过在页面中添加“1”来访问每个创建的页面......这就是为什么我需要随机ID的原因。 – John 2012-02-16 17:52:21

0

我建议你手动设置第一行的ID到100000,然后告诉数据库自动递增。下一行应该是100001,然后是100002等等。每个独特的。

+0

我不想要那样的东西。如果第一行有ID:100000,我不想让后面的行有ID:100001. – John 2012-02-16 17:49:10

+0

那么,你能更精确地知道你想要什么吗? – jurgemaister 2012-02-16 17:51:46

+0

我网站上的每个注册用户都可以创建如下网页:domain.com/928481,我希望网页具有随机ID,以便其他人无法访问他们,如果他们没有链接。 (有自动结合,问题在于下一行会=上一行+1,所以用户可以很容易地找到它们。) – John 2012-02-16 17:56:27

0

不知道为什么你真的愿意这样做,但你将不得不使用PHP的rand函数,看看它已经在数据库中,如果从开始重新开始,如果没有,那么用它来ID。

+0

我之前做过,直到现在。我问了这个问题,看看是否有另一种方式来做到这一点。 – John 2012-02-16 17:50:09

0

基本上你想有保证不会对你的输入范围碰撞的加密哈希。似乎没有人知道MD5的碰撞行为,所以这里是一个的保证不会有任何的算法:选择两个大数M和N有没有共同的divisors--他们可以是两个非常大的素数,或2**643**50,或任何。您将生成0..M-1范围内的数字。使用下面的散列函数:

H(k) = k*N (mod M)  

基本数论保证该序列具有范围0..M-1没有冲突。所以只要你的表中的ID小于M,你可以用这个函数对它们进行哈希处理,你就会得到明显的哈希值。如果使用无符号64位整数算术,则可以让M = 2**64。然后N可以是任意的奇数(我会选择足够大的东西来确保k * N> M),并且可以免费获得模运算作为算术溢出!

我写评论下面,但我这里最好重复一遍:这不是实现访问保护的好方法。但是,如果M足够大,它确实可以防止人们嘲笑你的所有内容。

相关问题