MySQL中比UUID更短的非重复字母数字代码

时间:2013-07-11 15:03:57

标签: mysql cryptography

当我插入记录时,MySQL数据库是否可以生成由数字和字母组成的5位或6位数代码?如果是这样的话?

就像goo.gl,bit.ly和jsfiddle一样。对于exaple:

cZ6ahF,3t5mM,xGNPN,xswUdS ......

所以UUID_SHORT()无效,因为它会返回23043966240817183

之类的值

要求:

  1. 必须是唯一的(非重复的)
  2. 可以但不要求基于主键整数值
  3. 必须缩放(使用所有可能的组合时增长一个字符)
  4. 必须随机查看。 (1234项不能为BCDE1235项为BCDF
  5. 必须才能在插入时生成。
  6. 非常感谢代码示例。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT LEFT(UUID(), 6);

答案 1 :(得分:1)

我建议实际使用Redis执行此任务。它具有使该任务适合其使用的所有功能。最重要的是,它非常擅长搜索大值列表。

我们将创建两个列表buffered_idsused_ids。一个cronjob将每5分钟(或你喜欢的任何间隔)运行,这将检查buffered_ids的长度并保持在长度上,例如5000。当您需要使用ID时,请从buffered_ids弹出,然后将其添加到used_ids

Redis有sets,它们是集合中的唯一项目。可以将其视为散列,其中键是唯一的,并且所有值都是“true”。

你的cronjob,用bash:

log(){ local x=$1 n=2 l=-1;if [ "$2" != "" ];then n=$x;x=$2;fi;while((x));do let l+=1 x/=n;done;echo $l; }
scale=`redis-cli SCARD used_ids`
scale=`log 16 $scale`
scale=$[ scale + 6]
while [ `redis-cli SCARD buffered_ids` -lt 5000 ]; do
    uuid=`cat /dev/urandom | tr -cd "[:alnum:]" | head -c ${1:-$scale}`
    if [ `redis-cli SISMEMBER used_ids $uuid` == 1]; then
        continue
    fi
    redis-cli SADD buffered_ids $uuid
done

获取下一个uid以便在你的应用程序中使用(因为你没有指定语言,所以是伪代码)

$uid = redis('SPOP buffered_ids');
redis('SADD used_ids ' . $uid);

编辑实际上那里有竞争条件。要安全地弹出值,请先将其添加到used_ids,然后将其从buffered_ids中删除。

$uid = redis('SRANDMEMBER buffered_ids');
redis('SADD used_ids ' . $uid);
redis('SREM buffered_ids ' . $uid);