V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
honkew
V2EX  ›  程序员

你们相信这是十几年的程序员写的代码吗?!

  •  1
     
  •   honkew · 41 天前 · 16104 次点击
    这是一个创建于 41 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到个事想和大家分享一下。 我们业务最近出了一个 bug

    我这边通过同事的接口获取快递面单 pdf 具体流程是 [包裹号] -> [资源 ID ] -> [快递面单 pdf ]

    也就是说: 拿着包裹号请求接口,拿到资源 ID 再用资源 ID 请求下载地址,获取 PDF

    然后发现奇怪的事情,包裹 A 和 包裹 B 获取到的快递面单串了,下载下来是一样的单号 资源 ID res_id 是 32 位数,相同一秒获取到的 pdf 就是一样的,猜测是采用 md5(time()) 这种方式命名文件

    然后和 同事 A 反馈了该问题,同事 A 反应已经修复 接下来一段时间还是出现这种问题会导致仓库发错货

    老板问我咋回事,我又去查日志发现同一时间 res_id 还是会一样的,这次精度有所提升不是秒了,大概精确到后面两位的样子

    然后和老板说了一下,是因为资源 id 还是一样的 这里他还改了一下运单文件在他服务器上的保存的命名方式,这个改动压根解决不了这个问题 然后同事 A 说他已经改了,没问题的,你不应该请求速度这么快 我直接整个大无语

    然后开会 我说建议使用 sha1(运单号) 的方式生产资源 id ,或者使用 UUID ,还没有说完直接反驳 说不安全巴拉巴拉,不安全可以 accessToken 验证啊,外部访问不到不就可以了 然后又说改算法耗费服务器性能巴拉巴拉的,老板又好声好气的让他想办法改一下 最后他改了,改成 md5(microtime(true))

    然后今天又又又出现这个 bug 了,老板又跑过来问我,我已经要疯了 这个问题前前后后几个月都没有弄好

    同事 A 是那种反驳性型人格,而且比较自大那种,我快待不下去了

    140 条回复    2025-08-11 11:11:42 +08:00
    1  2  
    foufoufm
        1
    foufoufm  
       41 天前   ❤️ 10
    为什么是你待不下去而不是他待不下去?

    求教
    honkew
        2
    honkew  
    OP
       41 天前
    @foufoufm 反驳性人格,工作不配合。 无进展,什么事情都找我
    foufoufm
        3
    foufoufm  
       41 天前   ❤️ 1
    @honkew 这是你历练的机会啊, 毕竟社会上不都是正常人。

    垃圾人比比皆是
    Mithril
        4
    Mithril  
       41 天前   ❤️ 26
    哈希算法是给你“验证”用的,不是拿来做“唯一标识”用的。因为它存在碰撞的可能。

    简而言之,哈希值一样,不代表原始值就一样。而哈希值不同,则肯定原始值不同。

    这就是为什么科班教学很重要。

    你这个需求就应该使用 uuid ,你用 SHA1 也避免不了碰撞。
    Vraw5
        5
    Vraw5  
       41 天前
    @honkew #2 你处理不了找 leader ,给 leader 压力,不要给自己压力
    InfiniteMirage
        6
    InfiniteMirage  
       41 天前
    @honkew 这种让老板知道问题在他那里不就好了,把问题越搞越大,老是出问题,然后你向主动请缨,接过去改,改完之后没有任何问题就成你功劳了,就显得那个同事不行,让老板记住
    wogogoing
        7
    wogogoing  
    PRO
       41 天前 via iPhone
    md5(microtime(true))

    PHP 吗?
    honkew
        8
    honkew  
    OP
       41 天前
    @InfiniteMirage 服务器在他那里,即便是我要过来改了,我怕他后面又动手脚
    honkew
        9
    honkew  
    OP
       41 天前
    @wogogoing 对的
    sparklee
        10
    sparklee  
       41 天前
    不能再加上自增 id 吗
    changnet
        11
    changnet  
       41 天前   ❤️ 1
    有什么奇怪的,只要你接触的人多,你就会发现,有些人做一辈子也没长进。我见过多了。

    像这种情况,你直接说是谁谁谁的问题,你自己不要再去解决这个问题,让上级去接触那个人。
    coderluan
        12
    coderluan  
       41 天前   ❤️ 1
    职场所有同事的问题都是领导的问题,看楼主描述你们是老板不懂技术每两个程序员的小公司,建议尽快早寻出路,你那同事就是一直呆在这种公司才变成现在这样的。
    BeforeTooLate
        13
    BeforeTooLate  
       41 天前
    @honkew 如果 php 直接 bin2hex(random_bytes(16)) 不就行了,这样下去估计他要 这样做了,哈哈哈。md5(microtime(true) ) . mt_rand(1, 999999))
    honkew
        14
    honkew  
    OP
       41 天前   ❤️ 1
    @BeforeTooLate 不知道为什么他对时间情有独钟啊,崩溃
    mosfet
        15
    mosfet  
       41 天前
    外部可以直接调用这个接口,不用做验证?
    先甩锅,再准备跑路吧
    小作坊也没这么草台啊
    bfdh
        16
    bfdh  
       41 天前
    意思是把 pdf 存临时文件再发给请求端,然后又重名了?不应该是直接发给客户端吗,为啥还要存临时文件?就算要存临时文件,不做重名检查吗?
    la2la
        17
    la2la  
       41 天前
    工作久了也就无所谓了
    这种情况直接给老板说明白,跟自己没有关系的问题,你应该是看戏的心态,跟你有啥关系啊
    msaionyc
        18
    msaionyc  
       41 天前
    对这个同事来说,这件事性质已经不是 bug 不 bug 了,尤其是到了老板面前还争执过,你不要直接和他对话了,找他领导或者跟老板说吧。
    Greendays
        19
    Greendays  
       41 天前
    这完全是他的问题啊,解释清楚就行了。接口返回错误和你有什么关系呢?你也没得办法的啊。
    honkew
        20
    honkew  
    OP
       41 天前
    @mosfet 其它接口都有验证,就是用 res_id 下载 pdf 这个接口没有验证
    rabbbit
        21
    rabbbit  
       41 天前
    不要当老板和他的传话筒,想办法让老板直接去找他。这样你就轻松了
    honkew
        22
    honkew  
    OP
       41 天前
    @la2la 只要仓库那边发错了就找到我这边,我还有其它工作要做,被这种问题天天烦。
    老板也指挥不动他,老板长期不在国内。只能让我改想让我“兼容”一下
    MuSeCanYang
        23
    MuSeCanYang  
       41 天前   ❤️ 1
    用 UUID 为啥会不安全啊? 完全没理解他的脑回路是啥。
    rabbbit
        24
    rabbbit  
       41 天前
    不要给他建议,让他自己解决吧。看样子他也不领你情
    ooTwToo
        25
    ooTwToo  
       41 天前
    他连 AI 都不用的吗?
    Vindroid
        26
    Vindroid  
       41 天前
    责任已经分清了,会上讨论过,你也给出了方案,你就不要那么在乎了,后续问题全部转给他就行了
    la2la
        27
    la2la  
       41 天前
    @honkew 那你也不做,直接让找他就行了。这种情况就比谁更更没有责任心
    lixining
        28
    lixining  
       41 天前
    啊我觉得 md5 ( time())又快又好啊。。。难道我是你同事?
    coderzhangsan
        29
    coderzhangsan  
       41 天前
    不牵扯你,就不要管;如果牵扯到你,就把问题反馈领导,说明原因,剩下让领导处理,固执的人没办法通过沟通解决的。

    最后,md5(microtime(true))这种方式生成随机数,最简单的方式加个随机数就可以大幅降低重名的概率,md5(microtime(true).mt_rand(10000000, 99999999)),都 25 年了,ai 都普及了,甚至直接去谷歌随便一搜索就有大把解决方案,我不相信这哥们蠢成这个样子,我猜测大概率是工作上,你让他不爽了。
    sojourner
        30
    sojourner  
       41 天前
    让老板知道是哪里出了问题,然后你给出解决方案。如果对方不改或不按给定的方案修改,你跟老板说清楚后剩下的和你无关。再次出问题,老板问的时候将问题产生的原因再次说清楚、给出解决方案,对方不改、或不按给定的方案解决,你报给老板,剩下的和你无关。你没有决定权的时候,让老板决定。我之前也总觉得很多人煞笔,现在我想清楚了,如果别人不煞笔,怎么能显出我的牛逼?
    Foxkeh
        31
    Foxkeh  
       41 天前
    建议服务端用雪花算法生成,杂凑和随机的都没法保证绝对不碰撞
    cryptovae
        32
    cryptovae  
       41 天前
    @lixining #28 刚毕业吗?或者你们的业务 QPS<1?
    frankkly
        33
    frankkly  
       41 天前
    不是,直接怼他啊,别给他留面子啊
    Subfire
        34
    Subfire  
       41 天前
    这个唯一 id 是服务器要保证的, 你这又没 bug 干啥老找你? bug 单转给服务器就行了
    angeni
        35
    angeni  
       41 天前
    你这个层级解决不了就找能解决的,你是打工的又不是和公司生死存亡的死士。该和稀泥就和
    ATKLLL
        36
    ATKLLL  
       41 天前
    是雪花算法性能不够高 还是 UUID 不够多 非得用这种乱七八糟的 ID
    fkdtz
        37
    fkdtz  
       41 天前
    讲理已经不行了,甩锅就行了。
    这个场景需要绝对唯一 ID ,建议记录详尽日志,
    出问题直接给老板,说他返回的 ID 不一致,所以导致发错货,
    garlics
        38
    garlics  
       41 天前
    你让他改雪花算法 uuid 啥的,他肯定不愿意。让他改成 date("YmdHisv") . mt_rand(1000000, 9999999) . mt_rand(10000000, 99999999) 吧,低并发的情况下肯定不会出现问题。
    R1
        39
    R1  
       41 天前
    这个一般用雪花数吧,MD5 主要用来校验吧
    pointerman
        40
    pointerman  
       41 天前
    @cryptovae
    @lixining
    就算你用纳秒好了,还要考虑服务器时钟回拨的可能
    javalaw2010
        41
    javalaw2010  
       41 天前
    先解决问题,他坚持不处理你就先看看能不能给他擦个屁股,自己加一个锁阻止并发,然后再跟他 battle 。不然公司黄了大家都没饭吃。
    chairuosen
        42
    chairuosen  
       41 天前
    三包法规定,同一零部件修三次还不好,可以退车
    jasonyang9
        43
    jasonyang9  
       41 天前 via Android
    不管他用什么算法如何实现,必须满足唯一 id 的需求,无论 qps 是多少
    irisdev
        44
    irisdev  
       41 天前 via Android
    ?用运单号不安全用时间戳就安全了?这什么脑回路,运单表没有主键吗,直接用运单表主键不就行了
    irrigate2554
        45
    irrigate2554  
       41 天前
    绝了,随机 uuid 不比时间 hash 安全么,时间 hash 还可以根据时间猜到
    deplives
        46
    deplives  
       41 天前
    uuid 不就是干这个事儿的吗?
    hwdq0012
        47
    hwdq0012  
       41 天前   ❤️ 4
    @Mithril #4 虽然我不是科班,但我知道这个问题, 相信很多不是科班的人也知道这种基本常识
    fengcs
        48
    fengcs  
       41 天前   ❤️ 1
    他不改就你改嘛,搞个令牌桶,1 秒处理一个请求
    wangtian2020
        49
    wangtian2020  
       41 天前
    以为时间不会重复的只能说纯蠢,这种写垃圾代码坑人的不少,就是没有基础的编程思维,这种人真适合来写前端,前端这种“对错”少,顶多不好看功能不能用,但不会出“错误”
    我和 op 一样是那种爱操心的性格,同事说服不了的话那就没办法了,要么跑路要么忍,反正把话都跟 leader 讲清楚,有解决方法不用就不是你的问题了

    说起来,快递站的系统有人手机号末尾和姓和我相同,结果老是发错短信,代码跟这个人写的一样蠢
    jfbcb
        50
    jfbcb  
       41 天前
    感同身受,工作也遇到了这样的.让他改东西,就说你针对他,这种让老板明白是他的问题.你不要跟他讨论这个问题.如果是 laravel,框架有 uuid 相关的实现函数.远离这种垃圾人.
    FrankAdler
        51
    FrankAdler  
       41 天前
    没问题的,你不应该请求速度这么快

    真牛逼啊
    zhouxiaoxiao
        52
    zhouxiaoxiao  
       41 天前
    你做个记录,每次下载下来的 ID 都记录下来,出现重复 就直接报错;把错误的问题来源直接指出来; 因为出问题的环节在你这里,而你又依赖他的接口; 所以直接报错,报出原因;
    irisdev
        53
    irisdev  
       41 天前
    @Mithril #4 sha1 碰撞的概率怕比 uuid 重复的概率还要低,当然这跟问题没什么关系就是了
    bli22ard
        54
    bli22ard  
       41 天前
    @Mithril #4 uuid 是 id ,sha1 是信息摘要算法,sha1 运算的结果取决于输入的值,这和 sha1 碰撞有多大关系?
    elevioux
        55
    elevioux  
       41 天前   ❤️ 1
    直接组个随机字符串也比 md5(一堆东西)好啊。我也是写 php 的,有些人确实“十年如一日”,技术不见长进的。
    xz410236056
        56
    xz410236056  
       41 天前   ❤️ 1
    年级越大的开发越这样,拒绝学习,拒绝接受新事物,死不认错。
    Felldeadbird
        57
    Felldeadbird  
       41 天前
    工作久了,菱角没了。换成我的话,不是我的问题我不去修复,也不给建议了。对方什么时候修复,我这边什么时候就正常工作。
    xz410236056
        58
    xz410236056  
       41 天前
    @lixining 明明有标准 API 为啥不用自己弄不标准的算法啊
    xz410236056
        59
    xz410236056  
       41 天前
    @Felldeadbird 你没遇到垃圾领导,我们厂(也可能就我们组这样),找到你了那你就是你倒霉甭管谁的责任你都得负责推,作为客户端/前端 那肯定先找你啊,客服、用户又不懂,就是无赖。
    ty29022
        60
    ty29022  
       41 天前
    @bli22ard 你是不是就是同事 A 呀
    sha1 是不是哈希算法, 哈希算法是不是就有碰撞概率, 在说什么啊?
    min
        61
    min  
       41 天前
    你做一个预防性动作,发现重复就前台把单拦住,不让发出去即可
    bitmin
        62
    bitmin  
       41 天前
    这是你领导的问题你急啥急,这就不是你的问题,你和领导说清楚,出事也是你领导被骂

    能解决的自己解决,解决不了的告知领导,让领导解决,自己不要放在心上

    你是打工人,你不是老板
    IamUNICODE
        63
    IamUNICODE  
       41 天前
    为什么用时间生成这种奇奇怪怪的随机数 id 啊,自增,uuid 是不香么
    zgzhang
        64
    zgzhang  
       41 天前
    这种人就是又菜又犟,努力学习离开这种垃圾地方,去大厂遇到这样的垃圾的概率非常低,你们老板缺乏基本的技术判断力,所以这么捣糨糊
    wenjie83
        65
    wenjie83  
       41 天前
    碰到过类似的情况,也是请求过快导致的对面接口异常,反馈给对方连个回应都没有,没把法只能手动增加请求间隔
    duzhuo
        66
    duzhuo  
       41 天前
    听起来是很严重的事故了
    patrickpu
        67
    patrickpu  
       41 天前
    论物种的多样性
    moreant
        68
    moreant  
       41 天前
    没有鉴权不用自增和时间戳可以理解,但是反正都是随机的,为什么不用 UUID ?
    Sfilata
        69
    Sfilata  
       41 天前
    下次遇到这种问题直接让老板找他,他怎么改也直接让老板解释。你又拍不了板,在这儿当传话筒纯纯内耗。
    sagaxu
        70
    sagaxu  
       41 天前
    他这么喜欢时间戳,可以用 uniqid("", true) 啊,虽然还是基于时间戳,但重复率比他写的低的多
    evan1
        71
    evan1  
    PRO
       41 天前
    自己在前端写个队列,请求先入队,队列里每个请求发起之前等待 1s🤡
    evan1
        72
    evan1  
    PRO
       41 天前
    @evan1 #69 我简直是个天才!
    zhhqiang
        73
    zhhqiang  
       41 天前 via Android
    毫秒级也是有机会重复的。数据库可以加个唯一 key 直接报错
    dlmy
        74
    dlmy  
       41 天前
    @honkew #2 你搞不定的事,上面有人能搞定,核心是你要把跟他的矛盾转变为所有人跟他的矛盾,这事才能解决
    evan1
        75
    evan1  
    PRO
       41 天前
    @evan1 #70 我现在调某个供应商的接口就是这么搞的,不过是间隔 500ms 。太快了他们的接口顶不住🤡
    TORYOI
        76
    TORYOI  
       41 天前
    time 肯定是不行的,日后有并发怎么办
    asmoker
        77
    asmoker  
       41 天前   ❤️ 1
    我说不结晶呢,原来是老鬼搞得~
    super452
        78
    super452  
       41 天前
    不是你的问题你慌啥,同事无法沟通直接找 leader 就行了
    issakchill
        79
    issakchill  
       41 天前
    求他问问 ai 吧...
    imnpc
        80
    imnpc  
       41 天前
    大概用的低版本的 PHP ,估计连 composer 都不支持,要不然多的是各种包能解决这个问题 ,最简单的参见 #13 就可以了
    lifeintools
        81
    lifeintools  
       41 天前
    @evan1 你简直是个天才
    ben1iu
        82
    ben1iu  
       41 天前   ❤️ 1
    这和工作十几年没关系 这可能是不到一年的经验 重复用了 十几年 实际有效经验一年都没有吧
    DinnyXu
        83
    DinnyXu  
       41 天前
    我给你一个思路:首先你已经知道问题的根本原因了,你就要去做大量的验证,大量的测试和复现,因为大家都是干程序的,数据是不会骗人的,你也不用在那生气,也不用为这点小事烦心,为什么我说是小事,因为这些还远没有到勾心斗角的地步,一般这种狂的人你必须要用实际数据来说话,因为我以前也遇到过,我说他错了,他就是不信,我做了一些大量的数据反复验证,反复比对结果,一次给他整服气,以后好生给我说话
    xloger
        84
    xloger  
       41 天前
    @MuSeCanYang doge 我不会的东西就是不安全的
    doyel
        85
    doyel  
       41 天前
    照例说按以前服务器的并发能力,我直接经常 Timestamp 直接拼串用,只要再接个业务 id 或者其他什么标识,同一个业务 ID 被毫秒级请求到的可能性已经接近于 0 了

    当然用 uuid 也可以,但是对于输出来说,之前的方法有先天的优势,文件名排序
    lysShub
        86
    lysShub  
       41 天前
    @Mithril 他这问题不是原始数据相同了吗?要是原始数据不重复,这个问题基本永远不会被发现
    unco020511
        87
    unco020511  
       41 天前
    uuid 即可
    tianzhiya
        88
    tianzhiya  
       41 天前
    @DinnyXu 他都说了“没问题的,你不应该请求速度这么快”,验证出来后估计他也是这说法
    zhaoyihuaer
        89
    zhaoyihuaer  
       41 天前
    知道问题在他那 还找你 这才是问题 [老板又好声好气的让他想办法改一下 最后他改了] 难道是小舅子?
    way2create
        90
    way2create  
       41 天前
    按你说的这么离谱,这感觉已经不是单纯的技术能力问题了,纯属人脑子态度有问题,退一万步就算这个人初次使用的时候不会不懂没考虑到不在乎,那出问题但凡是个正常人也很快能修复。

    虽然不是说什么都要用 uuid ,但也要考虑使用场景的,这 md5(time())明显不符合这种使用场景,而且重复了还会导致这样的后果是更逆天,太迷惑了
    DinnyXu
        91
    DinnyXu  
       41 天前
    @tianzhiya 他说了没问题,那为什么老板还要找啊,2 边人对质一下,当面给他戳穿,如果他还要说没问题,那就在老板面前说清楚,如果再出现问题,就喊老板找他
    DinnyXu
        92
    DinnyXu  
       41 天前
    @tianzhiya 对付无赖的人,拿出数据验证只是第一步,让更多人知道他是无赖,会打击他嚣张的心理,次数多了以后他的置信度就会降低,后面也不敢再过于狂妄
    Dora112233
        93
    Dora112233  
       41 天前
    又菜又犟
    JKeita
        94
    JKeita  
       41 天前
    让你老板把他开了呗,还能怎么办,都造成公司损失了还不开
    ryd994
        95
    ryd994  
       41 天前 via Android
    他在重新发明 UUID 。然后试图用伪•snowflake 算法来实现 UUID 。
    这个场景用 UUID 没毛病。性能不是问题,你们一天也就这么点快递,远没有到 UUID 会碰撞的量。也没有单调递增的要求(何况 hash 时间戳也没有单调递增)

    说完技术问题,再说行政问题。你没必要和他争。他的代码他负责没毛病。你要铁证如山摆在老板面前,而且留下书面证据,保证他的锅扣在他自己头上。剩下的就是你老板的问题了。公司不是你开的,有什么业务损失是公司的事,公司怪罪下来是你老板的事。反正没你什么事。你做好给你分配的事情就好了。
    Greendays
        96
    Greendays  
       41 天前
    话说这种情况直接拿包裹号来做资源 ID 不就可以了?包裹号不会重复的吧?
    sampeng
        97
    sampeng  
       41 天前
    尊重他人命运 放下助人情节。。你们相信这是一个工作 n 年人都没意识到的问题???

    最多说 1 次,第二次爱改不改,又不是我写的代码。老板问就是代码不是我写的,问题没出我这。除非我是 leader 或者项目负责人,那是另一回事。
    Geon97
        98
    Geon97  
       41 天前
    老板知道是他负责的不是你负责的,也给他建议了,不听就随便吧 反正和你没关系
    ryd994
        99
    ryd994  
       41 天前 via Android   ❤️ 1
    @honkew #14 时间戳比随机数省性能。对超高性能的系统来说,用时间戳没毛病。但是他这是邯郸学步,因为:
    1. 我上面说过了,你们这点并发度还没到需要这个的程度。
    2. 高性能时间戳也不是用 clock time 。读 clock time 同样非常耗性能,因为 syscall 至少需要一次上下文切换。高性能时间戳用的是 CPU 内部计数器 TSC 。这是一个从开机开始计算的单调递增数字,和现实时刻没有对应关系,只保证时长正确。
    3. md5 的性能开销就更加没边了,和伪随机数比还指不定哪个快一点。random 函数用的是系统默认随机数源,拿到的是参杂真随机熵的伪随机数。对于外部系统来说足够安全了。而且现代 CPU 还自带熵源,也会被掺杂进去。总的来说是足够随机了。
    真随机源也有,但是除了密码学应用,一般的情况不需要。
    Maiiiiii
        100
    Maiiiiii  
       41 天前
    @lixining #28 同一个 ts 的并发请求就重复了
    1  2  
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1212 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 17:29 · PVG 01:29 · LAX 10:29 · JFK 13:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.