我想问一下大家的 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 2016-06-09 19:35:11 +08:00
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 19:53:17 +08:00 via Android
不是不能用自增的嘛
|
12
eliteYang 2016-06-09 19:57:24 +08:00 1
看下 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 1
优雅简洁地实现短 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
@jsq2627 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() |