情况是这样的:
我的站点弄了一个QQ第三方登录的功能,但是QQ第三方登录返回的OPENID是32个字符的,而我的数据库中由于某些业务逻辑的原因,账号名必须是5~12位之间。
所以没办法用openid做账号。
用GUID的话也太长。
用useid做用户名的话,比如新增用户的时候先去取users表的MAX(id),然后MAX(id)+1做用户名但是这样的话可能会有并发的风险。求大虾指导

解决方案 »

  1.   

    就楼上是明白人啊。。在数据库判断这种唯一性,会并发的。如果加锁的话,非常影响性能。我最后打算这样做。SELECT MAX(userId) FROM users #得到最大的ID+1 再加上1~999的随机数 凑满12位先跑着。。等以后优化
      

  2.   

    http://msdn.microsoft.com/zh-cn/library/ms190024.aspx
      

  3.   

    1、让数据库的id取int,然后自动加1
    2、取时间,精确到毫秒
    3、先分配好1个数组,就是一连串的帐号,再从数组里取
      

  4.   

    你测试过“性能”吗?“加上1~999的随机数”这就不需要判断重复了吗?12字符随机的话 感觉随时能中枪;
    取后台MAX ID+1+rand()的话 高并发的时候 有几率中枪。。
      

  5.   

    这种需求其实不用这么考虑,他既是第三方如QQ登录,那么就去匹配存取的那个OPENID好了。注册用户则去匹配用户名。当然,若用户是以第三方账户登录的,你可以引导其去完善资料,在完善资料这块进行用户名的填写及更新(ajax验证、邮箱验证等等),总之让客户自己去操作好了!
      

  6.   

    你测试过“性能”吗?“加上1~999的随机数”这就不需要判断重复了吗?12字符随机的话 感觉随时能中枪;
    取后台MAX ID+1+rand()的话 高并发的时候 有几率中枪。。
    12字符随机的话 感觉随时能中枪,如果你这么感觉,那么无解
    因为这是碰撞概率最低的方式了。
      

  7.   

    你可以 先用 rand()获取一个12位的数字,然后在执行Update之前 select MAX(ID) from Table,然后用最大值+1 后执行Update就行了