以前,我使用foundhere类将userID转换为一些随机字符串。
从他的博客:
跑步:

alphaID(9007199254740989);

将返回“PpQXn7COf”和:
alphaID('PpQXn7COf', true);

将返回“9007199254740989”
所以我们的想法是用户可以做www.mysite.com/user/PpQXn7COf,我把它转换成一个普通整数,这样我就可以在mysql中做了
"Select * from Users where userID=".alphaID('PpQXn7COf', true)

现在我刚开始和卡桑德拉合作,我正在寻找替代者。
我想要像www.mysite.com/user/PpQXn7COf这样的url而不是像www.mysite.com/user/username1
“PpQXn7COf”uuid必须尽可能短。
在这里解释的Twissandra示例中:http://www.rackspace.com/cloud/blog/2010/05/12/cassandra-by-example/
他们创造了一些长的uuid(我猜它太长了,因为它几乎100%确定它是随机的)。
在mysql中,我有一个userID列,它是自动递增的,所以当我使用alphaID()函数时,总是得到一个很短的随机字符串。
有人知道怎么解决这个问题吗?
编辑:
它用于社交媒体网站,因此必须是持久的。
这也是我不想在url中使用用户名/实名的原因,如果用户需要的话,他们不能保持google不被发现。
我只是有一个简单的想法,但是我不知道它有多大的可扩展性
<?php
//createUUID() makes +- 14 char string with A-Z a-z 1-0 based on micro/milli/nanoseconds
while(get_count(createUUID()) > 0){//uuid  is unique
  //insert username pass, uuid etc into cassandra
  if($result == "1"){
      header('Location: http://www.mysite.com/usercenter');
  }else{
      echo "error";
  }
}
?>

当它达到twitter/facebook的规模时:
它会在可接受的时间内执行吗?
它是否仍能足够快地生成唯一的uuid,以便在每秒10000个用户注册时不会出现混乱?

最佳答案

自动增量不适用于健壮的分布式系统。只有当系统中的每个节点都可用时,才能分配唯一的ID,以确保其唯一。
当然,您可以创建自己的唯一id生成器,但您必须确保它将在基础结构中的任何位置生成唯一id。
例如,每个节点都可以有一个文件,它(使用适当的锁定等)只是增量,但您还需要确保它们不会冲突-例如,在生成算法中包含服务器ID。
这可能在操作上很重要-您的操作工程师需要确保基础结构中的所有服务器都配置正确,并设置了自己的ID生成器,以便它们不会生成相同的ID。但是,这是可能的。
uuid是合理的选择,因为它们肯定是唯一的。
UUID是128位;如果每个字符存储6位(即base64),则需要22个字符,这是一个相当长的URI。如果您希望它更短,您将需要以不同的方式生成唯一的id。
另外,这完全取决于你实际需要的身份证的“独特性”。如果几个月后您的id可以安全地重用,那么您可能可以在我们用
服务器ID
时间(粒度=2秒),但在几个月后结束
每服务器一个计数器(经常换行,但不在2秒内换行)
把所有的碎片粘在一起。这将生成一个长度小于64位的ID,但保证在所需的时间长度内是唯一的(在我们的情况下只有几个月)
如果出现以下情况,我们的算法将出现故障并生成重复的ID:
我们其中一个节点上的系统时钟向后移动的时间与计数器包装的时间相同。
我们的操作工程师犯了一个错误,将同一个服务器ID分配给两个服务器。
最后,大约9个月后。

07-25 22:46
查看更多