使用auto_increment生成PHP短唯一ID?
我想生成一个简短的唯一ID,而不必检查冲突.
我目前做这样的事情,但我当前生成的ID是随机的,并且在循环中检查冲突是令人讨厌的,并且如果记录数量显着增加将变得昂贵. 通常担心碰撞不是问题,但我想要生成的唯一ID是一个短的唯一字符串5-8个字符,字母数字,就像tinyurl一样. 编辑:我想从5个字符开始,如果我达到6000万个条目,那么转到6 ..依此类推. 为此,我想我可以使用对用户隐藏的auto_increment值,而是使用MD5或其他方法显示它们以从中生成唯一的字符串. 生成的字符串看起来不应该是线性的,所以简单地将auto_incremented ID转换为base 36 [0-9A-Z]有点过于简单了,但是这样的函数就是我要用的东西. 编辑:安全性不是问题,因为这不会用于保护信息.它只是一个较长字符串的快捷方式. 感谢您的建议,抱歉延误.牙医..
你需要通过构造正确的东西,即置换函数:这是一个函数,它将一个整数(你的顺序计数器)与另一个整数(你的顺序计数器)进行一对一的可逆映射.
一些例子(这些的任何组合也应该有效): >反转一些位(f.i.使用XOR,^在PHP中) 示例:此函数会将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 执行: a = 16807,c = 0,m = 2147483647 这给你一个2 ** 31的范围.使用pack(),您可以将结果整数作为字符串,base64_encode()使其成为可读字符串(最多6个有效字符,每字节6位),这可能是您的函数: substr(base64_encode(pack("l",(16807 * $index) % 2147483647)),6) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |