
我想问一下大家的 uid 是怎么生成的,uuid 有 32 位太长,目前的策略是时间戳+用户 ID+两位随机数
def make_uid(): a = str(int(time())) b = str(1).zfill(6) c = str(randint(10, 99)) return a + b + c a = make_uid() print(a) 但看了一下,有 18 位,感觉还是有些长,那么如何生成 10 位以内的不重复 uid 呢?
1 ZGLHHH 2016-06-09 18:43:21 +08:00 via Android uid 不是 user id 吗?我选择 MySQL 自增 |
2 honmaple OP 额, uid 不是 url id 吗,假设不用自增 ID |
3 Ouyangan 2016-06-09 18:54:56 +08:00 via Android 一般使用 uuid,你提出这个问题的出发点在哪里,短了对你有什么帮助 |
4 hxsf 2016-06-09 19:32:13 +08:00 via Android 写过一个短网址服务,一下是我的策略 短网址说白了就是 k-v 。 默认生成 key 长度为 6 ,然后查重,重复就长度+1 再生成,再重复再+1 。直到不重复。 方法虽然 low ,但是可以确保不重复且始终有解。 |
5 misaka19000 2016-06-09 19:33:33 +08:00 via Android 搭个车问下类似于 V 站的这种 284656 是如何生成的?有没有知道的能解释下 |
6 YUX PRO uid 不是 unique ID 嘛 |
7 murmur 2016-06-09 19:40:32 +08:00 @misaka19000 自增主键吧? |
8 SourceMan 2016-06-09 19:44:21 +08:00 via iPhone 你们想把你们公司对外宣传几千万用户,然而只有 10 多万而已的事实通过自增主键暴露出来吗 |
10 Syc 2016-06-09 19:52:35 +08:00 via Android DES[Base64[(MD5 加盐(SHA1(时间戳+用户 ID+随机数)))+随机数+随机数]] |
11 chineselittleboy 2016-06-09 1:53:17 +08:00 via Android 不是不能用自增的嘛 |
12 eliteYang 2016-06-09 19:57:24 +08:00 看下 snowflake 算法,比较适合你 |
13 murmur 2016-06-09 19:57:46 +08:00 @chineselittleboy 为什么不能自增 老用户 id 号短那是身份象征 |
14 fy 2016-06-09 20:03:46 +08:00 我自用的 ObjectID 生成 https://github.com/fy0/my-object-id |
15 fy 2016-06-09 20:04:36 +08:00 不过长度这种东西就没办法了 |
23 ethego 2016-06-09 22:27:29 +08:00 |
25 ihuotui 2016-06-09 22:33:57 +08:00 参考淘宝订单 id 规则。哈哈。 |
27 tabris17 2016-06-09 22:45:32 +08:00 自增 ID + Skip32 加密 |
28 zzzhan 2016-06-09 22:51:53 +08:00 优雅简洁地实现短 ID http://www.jianshu.com/p/ee469e1e1f9d |
31 julyclyde 2016-06-09 23:59:08 +08:00 我们公司早年是预先生成一堆,在一个单独保存 uid 的表里 用的时候取一个出来 |
32 jsq2627 2016-06-10 01:42:16 +08:00 @honmaple @ethego 在数据库中应用 UUID/GUID 要关注是否为 primary key 的问题。 很多数据库系统是把 primary key 作为 clustered index 的, UUID/GUID 这类比较长的 ID 不适合作为 clustered index ,但是很适合作为 primary key 。 如果数据库系统支持 clustered index 和 primary key 分离定义的话,应该用 UUID/GUID 列作为 primary key , auto increment 列作为 clustered index ,如果不支持分离,那最好还是别用 UUID/GUID 作为 primary key 。 |
33 ethego 2016-06-10 01:48:43 +08:00 @jsq627 http://inessential.com/2014/04/15/more_on_uuids_and_clustered_indexes 有一定的道理,但是不要盲目优化,确定 uuid 真的在当前业务下会引起足够的性能损失再做决定。 |
34 ryd994 2016-06-10 02:25:45 +08:00 谁说 uuid 比 20 位字符长的? uuid 是 128 位整数, 32 位 hex 字符 128 vs 32*8=256 mysql 官方文档: http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_uuid “ UUID() returns a value that conforms to UUID version 1 as described in RFC 4122. The value is a 128-bit number represented as a utf8 string of five hexadecimal numbers in aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee format ” |
35 9hills 2016-06-10 09:03:10 +08:00 没有 32B ,如果使用常用字符表示的话, uuid 20B 足够了,毕竟只有 128bit |
37 breeswish 2016-06-10 13:30:33 +08:00 直接 uuid 呀 |
38 practicer 2016-06-14 17:53:55 +08:00 我们公司用于跟踪用户行为的"uid"是 32 位长。能不能直接用标准库里的 hashlib 呢? import hashlib m = hashlib.md5() m.update('Obama') m.hexdigest() |