1
freedomshi Apr 9, 2019
自定义格式
|
2
Damon789 Apr 9, 2019
来学习下,目前我们在使用 UUID,不知道有啥其他的方案吗
|
3
honeycomb Apr 9, 2019 via Android
参考 objectId,snowflake 这些同时具备自增+随机(或自定义)项的 ID ?
|
4
cxh116 Apr 9, 2019 |
5
maemual Apr 9, 2019
发号器
|
6
shakaraka PRO uuid
|
10
lihongjie0209 Apr 9, 2019
只要是数字都可以枚举
204200231 和 1 的唯一区别就是枚举的难度而已。 不想用自增 ID 可以用 时间戳 |
11
cxh116 Apr 9, 2019 @imherer 引用文档 " If you need your ids to consist of only numbers, check out Optimus. It's based on Knuth's integer hash method and produces obfuscated integer ids (and does it faster too). There are PHP and Go implementations. "
|
13
x4storm Apr 9, 2019
时间戳加随机数
|
14
beiping96 Apr 9, 2019
Snowflake
|
15
arjen Apr 9, 2019 via Android
snowflake +1
|
16
lps Apr 9, 2019
时间戳+随机数
|
17
babedoll Apr 9, 2019
guid?
好吧这个一点都不易读 |
18
rogwan Apr 9, 2019 via Android
维护一个 ID 池,可以自己控制生成方式。
|
19
klgd Apr 9, 2019
容易被猜出来,然后呢?会有什么问题?
|
21
huangdayu Apr 9, 2019
将主键 id 加密
|
22
hansonwang99 Apr 9, 2019
|
23
huangdayu Apr 9, 2019
hashids
|
24
hansonwang99 Apr 9, 2019
用 vesta 也行,https://www.codesheep.cn/2018/11/22/springbt-vesta/
基本都是雪花算法 |
25
loveour Apr 9, 2019
为什么用户 id 是敏感信息,要用这个 id 做什么吗?有个简单做法,int 自增,另一半 int 随机一个数。之前我这用类似做法在用户 id 里填入一些自定义信息。这样,其中一部分很易读,但是想获得一个用户的完整 id 外部是做不到的。其实这个和拆分两个字段来确定一个用户差不多,和密码也差不多,只是合在了一起。再要么就随机数,哈希。
|
26
klgd Apr 9, 2019
@shiww #20 id 算什么敏感信息 我觉得只要能给到用户端看的,或者说能给第三个人看到的,都不算敏感,如果通过一个 id 就能获取用户的隐私信息,那么要么是原本就是设计如此,要么就是 bug
v2ex 的“第 xx 号会员”应该也是用户的自增 id 吧 |
27
jorneyr Apr 9, 2019
我们使用 Snowflake
|
28
feiyuanqiu Apr 9, 2019
@klgd #26 主要是防爬虫,一个用 ID 查询信息的接口,如果用自增 ID,爬虫一个循环就把数据爬走了,而复杂 ID 会让爬虫穷举的效率很低
|
29
feiyuanqiu Apr 9, 2019
@klgd #26 另外,自增 ID 会暴露系统用户数等商业敏感信息
|
30
ben1024 Apr 9, 2019
hashids
optimus |
31
zjsxwc Apr 9, 2019
所以最大的问题仅仅是设计接口时是否允许在 url 里暴露 id,而罪不在自增 id
|
32
bwangel Apr 9, 2019 这个问题叫做 ID 混淆,
http://python.jobbole.com/85534/ 这篇文章介绍了一种混淆 ID 的方法。这个不要再数据库层做,数据库中的 ID 一定要使用自增 ID,要不然会影响索引。这个需要在视图层做,Python web 框架可以搭配 WSGI 中间件一起实现。 如果使用 Django 搭建 API 服务,可以这么实现 1. 为 ID 新建一种类型,IntID 2. model 层返回的 id 字段都是 intID 类型 3. 视图层不要返回 HTTP Response,返回字典。 4. (关键)写一个 wsgi 中间件,拦截响应,如果响应是字典,则使用 JSON 格式化,并返回一个 JSONHTTP Response。JSON 格式化的时候需要自己写 encoder,判断如果是 IntID 类型,使用上述的混淆方法格式化,这样返回的整数是被混淆的字符串了 5. (关键)写一个 WSGI 中间件,拦截请求,将 POST 和 GET 数据都封装成字典存放到 request 中。然后每个请求的数据都要使用类似于 Form 的东西来处理一遍。Form 中自己可以实现一个 field,叫做 IntID field,就是执行反混淆的任务,将字符串的 ID 转换成数字 ID。 |
33
feiyuanqiu Apr 9, 2019
@zjsxwc #31 接口不可能不暴露 ID,不在 url 上暴露也会在请求 body 里。
自增 ID 还有一个问题是在分库分表系统中,会有 ID 重复的问题,所以包括 snowflake 在内的全局唯一 ID 方案,首要的目标就是为了支持分布式系统 |
34
whypool Apr 9, 2019
nanoid
|
35
night98 Apr 9, 2019
id 可自定义
id 从 100000000000 和 2000000000 开始自增,类似 qq 号的思路。 |
36
feiyuanqiu Apr 9, 2019
@bwangel #32 我们目前的方案是,主键用自增 ID,完全不参与业务逻辑,只用来当索引做排序;用 snowflake 生成一个业务 ID 唯一键,它是全局唯一的数据标识,参与业务。
|
37
joesonw Apr 9, 2019
防爬的在网管层做一层 hashid 不就好了吗
|
38
kayseen Jul 28, 2019
请问楼主最后选择了哪一种方法?
|