不用数据库, PHP 每 10 分钟内生成一个恒定随机数,该怎样实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
kisshere

不用数据库, PHP 每 10 分钟内生成一个恒定随机数,该怎样实现?

  •  2
     
  •   kisshere Aug 23, 2021 6488 views
    This topic created in 1707 days ago, the information mentioned may be changed or developed.

    api 请求一个 php 单文件,该 php 单文件(不调用数据库)每 10 分钟生成一个定值随机数,比如:

    8:00~8:10 请求该 php,只输出定值 23

    8:10~8:20 请求该 php,只输出定值 189

    8:20~8:30 请求该 php,只输出定值 3

    8:30~8:40 请求该 php,只输出定值 67

    ......

    这个该怎样实现?

    61 replies    2021-08-25 09:02:50 +08:00
    y7E6IG8spV7TU8n7
        1
    y7E6IG8spV7TU8n7  
       Aug 23, 2021   3
    if elseif else
    Switch ....
    dallaslu
        2
    dallaslu  
       Aug 23, 2021
    8:00~8:10 请求该 php:base_convert(md5('8:00'), 16, 10) % MAX_VALUE

    8:10~8:20 请求该 php:base_convert(md5('8:10'), 16, 10) % MAX_VALUE
    yousabuk
        3
    yousabuk  
       Aug 23, 2021 via iPhone
    说的再详细写才好看
    yEhwG10ZJa83067x
        4
    yEhwG10ZJa83067x  
       Aug 23, 2021
    定值随机数 怎么理解?
    zoharSoul
        5
    zoharSoul  
       Aug 23, 2021   26
    定值还叫随机数?

    五彩斑斓的黑是吧
    8bit
        6
    8bit  
       Aug 23, 2021   1
    估计是不重复的随机数吧
    gfreezy
        7
    gfreezy  
       Aug 23, 2021   5
    把 10 分钟当作随机数的种子,同一个 10 分钟内返回的都是同一个随机数
    hauzi
        8
    hauzi  
       Aug 23, 2021
    直接用 cache 吧,10 分钟过期重新生成
    dinghmcn
        9
    dinghmcn  
       Aug 23, 2021
    要第一次随机,其后直接使用该值?
    每次先检查当前时段随机值是否存在,不存在就取一个随机值并保存起来
    oott123
        10
    oott123  
       Aug 23, 2021   1
    <?php
    define('MY_SUPER_SECRET_CONSTANT', 123456789);
    srand(intval(time() / 600) + MY_SUPER_SECRET_CONSTANT);
    echo rand(0, 500);
    oott123
        11
    oott123  
       Aug 23, 2021   1
    以及我给的方法非常不安全(意味着该随机数可推测)。
    keepeye
        12
    keepeye  
       Aug 23, 2021
    楼主的意思是,10 分钟内只生成一次随机数,多次请求返回缓存值。所以用缓存就行了啊,往 /tmp/目录下写个缓存文件,把时间、数值记录进去,每次读取,判断时间决定要不要重新生成
    boboliu
        13
    boboliu  
       Aug 23, 2021 via Android   1
    你是不是在找:totp
    kisshere
        14
    kisshere  
    OP
       Aug 23, 2021
    @justrand
    @zoharSoul 是根据时间段返回不同的随机数,时间段的最小区间长度是 10 分钟,该区间内,输出恒定数
    kisshere
        15
    kisshere  
    OP
       Aug 23, 2021
    @keepeye 不往硬盘写文件,只用纯算法实现
    JKeita
        16
    JKeita  
       Aug 23, 2021
    $t = time();
    $t = $t - $t%600;
    srand($t);
    $v = rand();
    echo $v;
    keepeye
        17
    keepeye  
       Aug 23, 2021
    @kisshere 那你可以用 mt_srand 播种,种子就是时间拼成的整数
    pengtdyd
        18
    pengtdyd  
       Aug 23, 2021
    大胆猜测一下,这个问题的背后必然有一个伞兵的产品经理
    hxnets
        19
    hxnets  
       Aug 23, 2021
    恒定随机数???
    finull
        20
    finull  
       Aug 23, 2021
    @kisshere @boboliu 提到的 TOTP 值得考虑
    JKeita
        21
    JKeita  
       Aug 23, 2021
    srand 和 mt_srand 都是设置随机数种子,设置定值产生的随机数就一样了。
    InDom
        22
    InDom  
       Aug 23, 2021
    https://imgur.com/M5Zdlve

    以整时间作为随机数种子,同 #11,非常不安全,随机数可推测,某种理论来说,这已经不是随机数了。
    byteX
        23
    byteX  
       Aug 23, 2021
    生成一个 写到 redis 十分钟过期。
    RRRoger
        24
    RRRoger  
       Aug 23, 2021
    生成随机数的目的就是不可预测。

    你可以根据时间特性写个简单的算法。

    比如在 8:00~8:10 你取 08:05 把所有的值(0,8,0,5)加起来得 13 然后通过 md5 算法, 从后往前取后面的整数位。

    至于整数位的个数,你可以用时间里数字 0 的个数。

    这样肉眼不可预测, 也能达到随机效果
    lxz6597863
        25
    lxz6597863  
       Aug 23, 2021
    now := time.Now().Unix()
    fmt.Println(now - (now % 600))

    //600 秒 == 10 分钟
    boboliu
        27
    boboliu  
       Aug 23, 2021
    ganbuliao
        28
    ganbuliao  
       Aug 23, 2021
    那就很简单 8:00~8:10 就用 8:00 做这个加密算法的 value 不就行了 加密算法 就 什么随便的加减乘除一下 在截取一下就搞定了
    summerLast
        29
    summerLast  
       Aug 23, 2021
    日期取 yyyyMMddHHm
    summerLast
        30
    summerLast  
       Aug 23, 2021
    @summerLast 在复杂点 求个 hash
    summerLast
        31
    summerLast  
       Aug 23, 2021
    @summerLast 在复杂点加盐 求个 hash
    wavingclear
        32
    wavingclear  
       Aug 23, 2021
    抄一下网银实体数字密保、steam 手机验证器之类的离线随机数生成器的算法,他们几十秒更新一次你 10 分钟更新一次。
    binux
        33
    binux  
       Aug 23, 2021 via Android
    随便找一个随机数算法,取第时间 offset/10min 个数就行了。
    bghtyu
        34
    bghtyu  
       Aug 23, 2021 via Android
    就是 totp,Google 身份验证器那种
    eason1874
        35
    eason1874  
       Aug 23, 2021
    不用自己实现,找个 TOTP 类,把间隔时间(默认是 30 秒或 60 秒)改成 600 秒就 OK 了
    neptuno
        36
    neptuno  
       Aug 23, 2021
    是所有人都返回同一个随机数还是每个人随机数不同?所有人的话,生成一个随机数,缓存下来,后面的十分钟就返回这个随机数。每个人不同的话 totp
    feikeq
        37
    feikeq  
       Aug 23, 2021
    你是不是要做动态令牌。。。。。我以前做过动态密码每天密码不一样的那种
    mingl0280
        38
    mingl0280  
       Aug 23, 2021 via Android
    yyyyMMddHH 加上分钟取整加上 uid 哈希。totp 啊……
    Lemeng
        39
    Lemeng  
       Aug 23, 2021
    需求写的不是特别清楚
    fuxkcsdn
        40
    fuxkcsdn  
       Aug 23, 2021 via iPhone
    rsa 加密当前时间戳,保证恒定,保证随机

    bcmod(bcpow(time(), $e), $n)

    其中的 e 和 n 参数定义见
    https://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

    https://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
    fuxkcsdn
        41
    fuxkcsdn  
       Aug 23, 2021 via iPhone
    p.s.不要试图用 bcmath 拓展进行解密,超级慢。要解密的话用 gmp 拓展(只是相对 bcmath 快而已,数值大的话,解密也是慢)
    tabris17
        42
    tabris17  
       Aug 23, 2021
    return (int)(time() / 10)
    bixchen
        43
    bixchen  
       Aug 23, 2021
    单文件,反正都上服务器了。弄个 redis ttl 10min 是否存在,存在 return 不存在 create 然后 return
    imluvian
        44
    imluvian  
       Aug 23, 2021 via Android
    楼主你这是想抽奖作弊啊?
    Coder89757
        45
    Coder89757  
       Aug 23, 2021
    面试题请自己做,谢谢。。。
    Juszoe
        46
    Juszoe  
       Aug 23, 2021
    每十分钟生成一个新的随机数,保存到全局变量里。
    建议楼主描述清楚需求,不然又成一个 X-Y problem
    shellus
        47
    shellus  
       Aug 23, 2021
    其实你就是想生成一个动态的加密串,防止前端的加密串被拿去一直用。
    所以每 10 分钟这个加密串就禁用了。前端必须重新获取,是吧?
    不要重复造轮子了,这就是 JWT Auth
    Hardrain
        48
    Hardrain  
       Aug 23, 2021
    时间戳 /600 作为 random seed?
    crab
        49
    crab  
       Aug 23, 2021
    对时间间隔取余来固定种子数值
    yogogo
        50
    yogogo  
       Aug 23, 2021   1
    不要碰灰产
    w3cll
        51
    w3cll  
       Aug 23, 2021
    @yogogo 看来你有故事
    RRyo
        52
    RRyo  
       Aug 23, 2021 via iPhone
    时间戳除你需要的间隔,做种子生成随机数,更工程化的可以参考 2FA 的那套东西,很多现成的库
    EscYezi
        53
    EscYezi  
       Aug 23, 2021 via iPhone
    具体场景是怎么样的?
    yuzo555
        54
    yuzo555  
       Aug 23, 2021
    用 hash 算法,比如 md5,原文为 intval(time() / 600) 加上一个很长的盐值,然后取十六进制格式的最后几位(具体几位取决于你想要的数字大小范围),然后转为十进制数。
    hefish
        55
    hefish  
       Aug 23, 2021
    难得大家如此热情,我觉着这个需求莫名其妙,非常奇葩。 没有责怪 LZ 的意思,纯粹觉着需求奇葩。
    huskyui
        56
    huskyui  
       Aug 24, 2021
    每天凌晨,可以预先生成一个满足数量的数组,然后打乱.根据时间点
    GeruzoniAnsasu
        57
    GeruzoniAnsasu  
       Aug 24, 2021
    @zoharSoul

    鉴于本楼 lz 的问题已经得到解答了,歪个题,看看这算不算「五彩斑斓的黑」


    gitdoit
        58
    gitdoit  
       Aug 24, 2021
    题目半天没读明白,还有这么多人回答, 我觉得我脑子有问题
    zjsxwc
        59
    zjsxwc  
       Aug 24, 2021
    如果不能用数据库等存储(文件系统也算数据库)的话,

    每 10 秒恒定就说明你这个随机数是由你当前时间确定的,于是你这个随机根本就不是随机数!

    如果不是随机数,那么解决楼主需求的办法确实只有用 rsa 非对称加密办法了,最多就是密钥每天换一个新的。
    pckillers
        60
    pckillers  
       Aug 24, 2021
    @zjsxwc 把年月日也加进判断不就得了。 日期 + 时间(精确到 10 分钟) + 字符 做个 MD5 再随便想个公式变回数字。 也看起来差不多像随机数了。
    raysonlu
        61
    raysonlu  
       Aug 25, 2021
    就题目看,明显就 if else 完事,但感觉明显就是题目需求都没有说清楚
    About     Help     Advertise     Blog     API     FAQ     Solana     824 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 144ms UTC 21:13 PVG 05:13 LAX 14:13 JFK 17:13
    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