gpt4 book ai didi

使用 auto_increment 生成 PHP 短唯一 ID?

转载 作者:可可西里 更新时间:2023-11-01 06:37:17 25 4
gpt4 key购买 nike

我想生成一个简短的唯一 ID,而无需检查冲突。

我目前正在做类似的事情,但我目前生成的 ID 是随机的,并且在循环中检查冲突很烦人,如果记录数量显着增加,成本会变得很高。

通常担心冲突不是问题,但我想要生成的唯一 ID 是一个简短的唯一字符串,包含 5-8 个字符,字母数字,就像 tinyurl 一样。

编辑:我想从 5 个字符开始,如果我达到 6000 万个条目,然后转到 6.. 依此类推。

为此,我想我可以使用一个对用户隐藏的 auto_increment 值,并用 MD5 或其他方法向他们展示,以从中生成一个唯一的字符串。

生成的字符串不应该看起来是线性的,所以简单地将 auto_incremented ID 转换为 base 36 [0-9A-Z] 有点太简单了,但是像这样的函数是我的地方开始吧。

编辑:安全不是问题,因为这不会用于保护信息。它只是一个较长字符串的快捷方式。谢谢。

感谢您的建议,对于延误,我们深表歉意。牙医..

最佳答案

您需要一些构造正确的东西,即置换函数:这是一个将一个整数(您的顺序计数器)到另一个整数(您的顺序计数器)进行一对一、可逆映射的函数。一些例子(这些的任何组合也应该有效):

  • 反转一些位(例如使用异或,在 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

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

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)), 0, 6)

关于使用 auto_increment 生成 PHP 短唯一 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com