php 按顺序生成id,使用auto_increment生成PHP短唯一ID?

你需要通过构造正确的东西,即置换函数:这是一个函数,它将一个整数(你的顺序计数器)与另一个整数(你的顺序计数器)进行一对一的可逆映射.

一些例子(这些的任何组合也应该有效):

>反转一些位(f.i.使用XOR,^在PHP中)

>交换位数(($i& 0xc)>> 2 |($i& 0x3)<< 2),或者只是颠倒所有位的顺序

>添加一个常数值,以模拟你的最大范围(如果你把它与上面的那个结合起来,必须是两倍)

示例:此函数会将0,1,2,3,5,..转换为13,4,12,7,15,..,数字最多为15:

$i=($input+97) & 0xf;

$result=((($i&0x1) << 3) + (($i&0xe) >> 1)) ^ 0x5;

编辑

一种更简单的方法是使用线性同余生成器(LCG,通常用于生成随机数),它由以下形式的公式定义:

X_n+1 = (a * X_n + c) mod m

对于a,c和m的good values,X_0,X_1 … X_m-1的序列将包含0和m-1之间的所有数字恰好一次.现在,您可以从线性增加的索引开始,并使用LCG序列中的下一个值作为“秘密”键.

EDIT2

执行:

你可以design your own LCG parameters,但如果你弄错了它将不会覆盖整个范围(因此有重复)所以我将使用this paper中已发布和尝试过的一组参数:

a = 16807,c = 0,m = 2147483647

这给你一个2 ** 31的范围.使用pack(),您可以将结果整数作为字符串,base64_encode()使其成为可读字符串(最多6个有效字符,每字节6位),这可能是您的函数:

substr(base64_encode(pack("l",(16807 * $index) % 2147483647)),6)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值