V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kisshere
V2EX  ›  程序员

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

  •  
  •   kisshere · 2022-08-09 09:36:56 +08:00 · 7658 次点击
    这是一个创建于 597 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如: 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 生成的 :)
    ily433664
        5
    ily433664  
       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 嘛
    fzdwx
        9
    fzdwx  
       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  
       2022-08-09 12:01:45 +08:00
    @wu00 #15
    你这 INT 范围是不是有点武断了
    wu00
        18
    wu00  
       2022-08-09 12:08:00 +08:00
    @realpg 按你这个说法,我觉得“武断”这个词用的不太准确,应该用“草率”
    infun
        19
    infun  
       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   ·   我们的愿景   ·   实用小工具   ·   1148 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 23:00 · PVG 07:00 · LAX 16:00 · JFK 19:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.