今日头条这种超长 int id 是怎么生成的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
kisshere
V2EX    程序员

今日头条这种超长 int id 是怎么生成的?

  •  
  •   kisshere 2022-08-09 09:36:56 +08:00 8584 次点击
    这是一个创建于 1173 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如: https://www.toutiao.com/article/7129539941947671076/
    难道其数据库的主键是 bigint 自增类型,该新闻在数据库中的 id 是“7129539941947671076”,可推断今日头条至少都有 7129539941947671076 篇文章了?不可能吧,那这种 id 是怎样生成的?
    35 条回复    2022-08-12 15:24:32 +08:00
    xieqiqiang00
        1
    xieqiqiang00  
       2022-08-09 09:40:29 +08:00
    有没有可能,这不是自增 id ?
    而是类似 hash 的字符串?
    SuperXRay
        2
    SuperXRay  
       2022-08-09 09:40:49 +08:00
    为什么觉得是 int 的?
    sarices
        3
    sarices  
       2022-08-09 09:40:59 +08:00
    参考一下 美团 leaf 或者 Twitter 的雪花算法
    zonyitoo
        4
    zonyitoo  
       2022-08-09 09:42:44 +08:00   6
    7129539941947671076 用 16 进制表示就是 0x62f136cda3c00224 ,可以发现恰好是 8 个字节 62f1 36cd a3c0 0224 。估计只是一个普通的 64-bits ID 而已,不一定是顺序生成的,里面应该包含了信息,比如时间戳之类的。

    拍个脑袋,也许就是直接用 snowflake 生成的 :)
    lovelive1024
        5
    lovelive1024  
       2022-08-09 09:43:05 +08:00
    雪花算法
    q1119145488
        6
    q1119145488  
       2022-08-09 09:43:34 +08:00
    分布式 ID ,可以了解一下其中一种-雪花 id
    xytest
        7
    xytest  
       2022-08-09 09:47:47 +08:00
    Snowflake
    nitmali
        8
    nitmali  
       2022-08-09 09:51:30 +08:00
    再不济 也应该是 long 嘛
    lllllliiii
        9
    lllllliiii  
       2022-08-09 10:05:32 +08:00
    19 位,属于正常的长度。
    IDAEngine
        10
    IDAEngine  
       2022-08-09 10:10:30 +08:00
    Snowflake
    yohole
        11
    yohole  
       2022-08-09 10:30:29 +08:00
    确实,为啥 OP 会觉得是 int 啊?不解
    FightPig
        12
    FightPig  
       2022-08-09 10:36:24 +08:00
    这肯定不是 int 的,分布式生成的 ID 吧
    xbh1794970183564
        13
    xbh1794970183564  
       2022-08-09 10:38:05 +08:00
    用的是分布式生成器生成的,对应 go 中的 int64
    Jooooooooo
        14
    Jooooooooo  
       2022-08-09 10:38:14 +08:00
    很长的数字几乎都是雪花.
    wu00
        15
    wu00  
       2022-08-09 10:44:49 +08:00
    Snowflake
    是顺序的
    int 范围 -2147483648~2147483647
    js 中 Number.MAX_VALUE=1.7976931348623157e+308 ,注意精度丢失问题
    autulin
        16
    autulin  
       2022-08-09 11:25:21 +08:00 via iPhone
    雪花算法+int64
    realpg
        17
    realpg  
    PRO
       2022-08-09 12:01:45 +08:00
    @wu00 #15
    你这 INT 范围是不是有点武断了
    wu00
        18
    wu00  
       2022-08-09 12:08:00 +08:00
    @realpg 按你这个说法,我觉得“武断”这个词用的不太准确,应该用“草率”
    GlobalNPC
        19
    GlobalNPC  
       2022-08-09 12:15:11 +08:00
    WhateverYouLike
        20
    WhateverYouLike  
       2022-08-09 12:37:19 +08:00 via Android
    @wu00 前两天写 js 就遇到了,丢精度
    beordle
        21
    beordle  
       2022-08-09 13:22:04 +08:00
    如果是数字的话,实际上你可以使用数字爬取到全部文章了,这是一个严重的安全漏洞。那么利用它,要不他不存在。你不妨试一试。
    meteor957
        22
    meteor957  
       2022-08-09 13:23:09 +08:00
    是 char 吧
    yujinchn
        23
    yujinchn  
       2022-08-09 13:33:02 +08:00
    明显不是自带的自增 id 啊
    mengyx
        24
    mengyx  
       2022-08-09 13:43:47 +08:00 via Android
    分布式 ID 生成器,基于时间、机器 ID 、序号等生成的 int64 ,类似的可以看看 Snowflake
    vace
        25
    vace  
       2022-08-09 14:02:07 +08:00
    随便打开一个列表页面,在控制台输入下面的代码,就能获取到 64bit 的 snowflake ID 列表了。

    ```js
    $$('.title').map(t => t.href).filter(Boolean).map(t => t.match(/\/(\d+)\//)?.[1]).map(t => t && BigInt(t).toString(2))
    ```
    xiaoliu926
        26
    xiaoliu926  
       2022-08-09 14:08:01 +08:00
    正好我司去年底数据库表 id 使用了雪花算法,生成的 id 就是随机一大串
    xiaoliu926
        27
    xiaoliu926  
       2022-08-09 14:09:46 +08:00
    可以肯定地说这就是数据库表的主键 id. Long 型
    xuelu520
        28
    xuelu520  
       2022-08-09 14:35:37 +08:00
    百度雪花算法。一个不规则 ID 生成算法。现在大部分都用的这个吧,简单高效,轮子也多。
    Akitora
        29
    Akitora  
       2022-08-09 14:41:33 +08:00
    肯定不是连续的,推特也是这样,估计也有反爬虫的考量
    unclejock
        30
    unclejock  
       2022-08-09 18:26:25 +08:00   1
    你为什么觉得它是 int ?这是个很关键的问题
    victorc
        31
    victorc  
       2022-08-09 21:59:23 +08:00
    int64 ,用类似雪花算法的 id 生成器生成的,字节所有的 id 都是这样产生的
    xiangyuecn
        32
    xiangyuecn  
       2022-08-09 22:04:39 +08:00
    @wu00 #15 Number.MAX_SAFE_INTEGER
    wcp1231
        33
    wcp1231  
       2022-08-10 09:54:30 +08:00
    也有可能 ID 是从 7129539941947671000 开始递增的,所以有可能头条只有 76 篇文章 (doge
    Konys
        34
    Konys  
       2022-08-10 11:12:59 +08:00
    美团修改后的雪花算法,不是自增+1 的,但是确实是不断向前增大的,我记得是美团有专门的服务器用来生成这个 id ,其他项目请求这个服务器获取 id ,大概是这么个意思,很久之前看的美团的技术文章
    symons
        35
    symons  
       2022-08-12 15:24:32 +08:00
    1. 这种 id 是不可遍历的自增的 id
    2. 服务端存储用 big int
    3. 跟前端交互用 string ,否则会丢精度
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1309 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION 3.9.8.5 111ms UTC 16:54 PVG 00:54 LAX 09:54 JFK 12:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86