• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kisshere
V2EX  ›  程序员

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

  •  2
     
  •   kisshere · Aug 23, 2021 · 7047 views
    This topic created in 1899 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
    y7E6IG8spV7TU8n7
    Aug 23, 2021❤️3
    1
    if elseif else
    Switch ....
    dallaslu
    dallaslu
    Aug 23, 2021
    2
    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
    yousabuk
    Aug 23, 2021 via iPhone
    3
    说的再详细写才好看
    yEhwG10ZJa83067x
    yEhwG10ZJa83067x
    Aug 23, 2021
    4
    定值随机数 怎么理解?
    zoharSoul
    zoharSoul
    Aug 23, 2021❤️26
    5
    定值还叫随机数?

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

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

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

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

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

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

    //600 秒 == 10 分钟
    boboliu
    boboliu
    Aug 23, 2021
    27
    ganbuliao
    ganbuliao
    Aug 23, 2021
    28
    那就很简单 8:00~8:10 就用 8:00 做这个加密算法的 value 不就行了 加密算法 就 什么随便的加减乘除一下 在截取一下就搞定了
    summerLast
    summerLast
    Aug 23, 2021
    29
    日期取 yyyyMMddHHm
    summerLast
    summerLast
    Aug 23, 2021
    30
    @summerLast 在复杂点 求个 hash
    summerLast
    summerLast
    Aug 23, 2021
    31
    @summerLast 在复杂点加盐 求个 hash
    wavingclear
    wavingclear
    Aug 23, 2021
    32
    抄一下网银实体数字密保、steam 手机验证器之类的离线随机数生成器的算法,他们几十秒更新一次你 10 分钟更新一次。
    binux
    binux
    Aug 23, 2021 via Android
    33
    随便找一个随机数算法,取第时间 offset/10min 个数就行了。
    bghtyu
    bghtyu
    Aug 23, 2021 via Android
    34
    就是 totp,Google 身份验证器那种
    eason1874
    eason1874
    Aug 23, 2021
    35
    不用自己实现,找个 TOTP 类,把间隔时间(默认是 30 秒或 60 秒)改成 600 秒就 OK 了
    neptuno
    neptuno
    Aug 23, 2021
    36
    是所有人都返回同一个随机数还是每个人随机数不同?所有人的话,生成一个随机数,缓存下来,后面的十分钟就返回这个随机数。每个人不同的话 totp
    feikeq
    feikeq
    Aug 23, 2021
    37
    你是不是要做动态令牌。。。。。我以前做过动态密码每天密码不一样的那种
    mingl0280
    mingl0280
    Aug 23, 2021 via Android
    38
    yyyyMMddHH 加上分钟取整加上 uid 哈希。totp 啊……
    Lemeng
    Lemeng
    Aug 23, 2021
    39
    需求写的不是特别清楚
    fuxkcsdn
    fuxkcsdn
    Aug 23, 2021 via iPhone
    40
    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
    fuxkcsdn
    Aug 23, 2021 via iPhone
    41
    p.s.不要试图用 bcmath 拓展进行解密,超级慢。要解密的话用 gmp 拓展(只是相对 bcmath 快而已,数值大的话,解密也是慢)
    tabris17
    tabris17
    Aug 23, 2021
    42
    return (int)(time() / 10)
    bixchen
    bixchen
    Aug 23, 2021
    43
    单文件,反正都上服务器了。弄个 redis ttl 10min 是否存在,存在 return 不存在 create 然后 return
    imluvian
    imluvian
    Aug 23, 2021 via Android
    44
    楼主你这是想抽奖作弊啊?
    Coder89757
    Coder89757
    Aug 23, 2021
    45
    面试题请自己做,谢谢。。。
    Juszoe
    Juszoe
    Aug 23, 2021
    46
    每十分钟生成一个新的随机数,保存到全局变量里。
    建议楼主描述清楚需求,不然又成一个 X-Y problem
    shellus
    shellus
    Aug 23, 2021
    47
    其实你就是想生成一个动态的加密串,防止前端的加密串被拿去一直用。
    所以每 10 分钟这个加密串就禁用了。前端必须重新获取,是吧?
    不要重复造轮子了,这就是 JWT Auth
    Hardrain
    Hardrain
    Aug 23, 2021
    48
    时间戳 /600 作为 random seed?
    crab
    crab
    Aug 23, 2021
    49
    对时间间隔取余来固定种子数值
    yogogo
    yogogo
    Aug 23, 2021❤️1
    50
    不要碰灰产
    w3cll
    w3cll
    Aug 23, 2021
    51
    @yogogo 看来你有故事
    RRyo
    RRyo
    Aug 23, 2021 via iPhone
    52
    时间戳除你需要的间隔,做种子生成随机数,更工程化的可以参考 2FA 的那套东西,很多现成的库
    EscYezi
    EscYezi
    Aug 23, 2021 via iPhone
    53
    具体场景是怎么样的?
    yuzo555
    yuzo555
    Aug 23, 2021
    54
    用 hash 算法,比如 md5,原文为 intval(time() / 600) 加上一个很长的盐值,然后取十六进制格式的最后几位(具体几位取决于你想要的数字大小范围),然后转为十进制数。
    hefish
    hefish
    Aug 23, 2021
    55
    难得大家如此热情,我觉着这个需求莫名其妙,非常奇葩。 没有责怪 LZ 的意思,纯粹觉着需求奇葩。
    huskyui
    huskyui
    Aug 24, 2021
    56
    每天凌晨,可以预先生成一个满足数量的数组,然后打乱.根据时间点
    GeruzoniAnsasu
    GeruzoniAnsasu
    Aug 24, 2021
    57
    @zoharSoul

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


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

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

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