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
......
这个该怎样实现?
1
y7E6IG8spV7TU8n7 Aug 23, 2021 if elseif else
Switch .... |
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 |
3
yousabuk Aug 23, 2021 via iPhone
说的再详细写才好看
|
4
yEhwG10ZJa83067x Aug 23, 2021
定值随机数 怎么理解?
|
5
zoharSoul Aug 23, 2021 定值还叫随机数?
五彩斑斓的黑是吧 |
6
8bit Aug 23, 2021 估计是不重复的随机数吧
|
7
gfreezy Aug 23, 2021 把 10 分钟当作随机数的种子,同一个 10 分钟内返回的都是同一个随机数
|
8
hauzi Aug 23, 2021
直接用 cache 吧,10 分钟过期重新生成
|
9
dinghmcn Aug 23, 2021
要第一次随机,其后直接使用该值?
每次先检查当前时段随机值是否存在,不存在就取一个随机值并保存起来 |
10
oott123 Aug 23, 2021 <?php
define('MY_SUPER_SECRET_CONSTANT', 123456789); srand(intval(time() / 600) + MY_SUPER_SECRET_CONSTANT); echo rand(0, 500); |
11
oott123 Aug 23, 2021 以及我给的方法非常不安全(意味着该随机数可推测)。
|
12
keepeye Aug 23, 2021
楼主的意思是,10 分钟内只生成一次随机数,多次请求返回缓存值。所以用缓存就行了啊,往 /tmp/目录下写个缓存文件,把时间、数值记录进去,每次读取,判断时间决定要不要重新生成
|
13
boboliu Aug 23, 2021 via Android 你是不是在找:totp
|
16
JKeita Aug 23, 2021
$t = time();
$t = $t - $t%600; srand($t); $v = rand(); echo $v; |
18
pengtdyd Aug 23, 2021
大胆猜测一下,这个问题的背后必然有一个伞兵的产品经理
|
19
hxnets Aug 23, 2021
恒定随机数???
|
21
JKeita Aug 23, 2021
srand 和 mt_srand 都是设置随机数种子,设置定值产生的随机数就一样了。
|
22
InDom Aug 23, 2021
|
23
byteX Aug 23, 2021
生成一个 写到 redis 十分钟过期。
|
24
RRRoger Aug 23, 2021
生成随机数的目的就是不可预测。
你可以根据时间特性写个简单的算法。 比如在 8:00~8:10 你取 08:05 把所有的值(0,8,0,5)加起来得 13 然后通过 md5 算法, 从后往前取后面的整数位。 至于整数位的个数,你可以用时间里数字 0 的个数。 这样肉眼不可预测, 也能达到随机效果 |
25
lxz6597863 Aug 23, 2021
now := time.Now().Unix()
fmt.Println(now - (now % 600)) //600 秒 == 10 分钟 |
26
boboliu Aug 23, 2021
|
27
boboliu Aug 23, 2021
|
28
ganbuliao Aug 23, 2021
那就很简单 8:00~8:10 就用 8:00 做这个加密算法的 value 不就行了 加密算法 就 什么随便的加减乘除一下 在截取一下就搞定了
|
29
summerLast Aug 23, 2021
日期取 yyyyMMddHHm
|
30
summerLast Aug 23, 2021
@summerLast 在复杂点 求个 hash
|
31
summerLast Aug 23, 2021
@summerLast 在复杂点加盐 求个 hash
|
32
wavingclear Aug 23, 2021
抄一下网银实体数字密保、steam 手机验证器之类的离线随机数生成器的算法,他们几十秒更新一次你 10 分钟更新一次。
|
33
binux Aug 23, 2021 via Android
随便找一个随机数算法,取第时间 offset/10min 个数就行了。
|
34
bghtyu Aug 23, 2021 via Android
就是 totp,Google 身份验证器那种
|
35
eason1874 Aug 23, 2021
不用自己实现,找个 TOTP 类,把间隔时间(默认是 30 秒或 60 秒)改成 600 秒就 OK 了
|
36
neptuno Aug 23, 2021
是所有人都返回同一个随机数还是每个人随机数不同?所有人的话,生成一个随机数,缓存下来,后面的十分钟就返回这个随机数。每个人不同的话 totp
|
37
feikeq Aug 23, 2021
你是不是要做动态令牌。。。。。我以前做过动态密码每天密码不一样的那种
|
38
mingl0280 Aug 23, 2021 via Android
yyyyMMddHH 加上分钟取整加上 uid 哈希。totp 啊……
|
39
Lemeng Aug 23, 2021
需求写的不是特别清楚
|
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 |
41
fuxkcsdn Aug 23, 2021 via iPhone
p.s.不要试图用 bcmath 拓展进行解密,超级慢。要解密的话用 gmp 拓展(只是相对 bcmath 快而已,数值大的话,解密也是慢)
|
42
tabris17 Aug 23, 2021
return (int)(time() / 10)
|
43
bixchen Aug 23, 2021
单文件,反正都上服务器了。弄个 redis ttl 10min 是否存在,存在 return 不存在 create 然后 return
|
44
imluvian Aug 23, 2021 via Android
楼主你这是想抽奖作弊啊?
|
45
Coder89757 Aug 23, 2021
面试题请自己做,谢谢。。。
|
46
Juszoe Aug 23, 2021
每十分钟生成一个新的随机数,保存到全局变量里。
建议楼主描述清楚需求,不然又成一个 X-Y problem |
47
shellus Aug 23, 2021
其实你就是想生成一个动态的加密串,防止前端的加密串被拿去一直用。
所以每 10 分钟这个加密串就禁用了。前端必须重新获取,是吧? 不要重复造轮子了,这就是 JWT Auth |
48
Hardrain Aug 23, 2021
时间戳 /600 作为 random seed?
|
49
crab Aug 23, 2021
对时间间隔取余来固定种子数值
|
50
yogogo Aug 23, 2021 不要碰灰产
|
52
RRyo Aug 23, 2021 via iPhone
时间戳除你需要的间隔,做种子生成随机数,更工程化的可以参考 2FA 的那套东西,很多现成的库
|
53
EscYezi Aug 23, 2021 via iPhone
具体场景是怎么样的?
|
54
yuzo555 Aug 23, 2021
用 hash 算法,比如 md5,原文为 intval(time() / 600) 加上一个很长的盐值,然后取十六进制格式的最后几位(具体几位取决于你想要的数字大小范围),然后转为十进制数。
|
55
hefish Aug 23, 2021
难得大家如此热情,我觉着这个需求莫名其妙,非常奇葩。 没有责怪 LZ 的意思,纯粹觉着需求奇葩。
|
56
huskyui Aug 24, 2021
每天凌晨,可以预先生成一个满足数量的数组,然后打乱.根据时间点
|
57
GeruzoniAnsasu Aug 24, 2021
|
58
gitdoit Aug 24, 2021
题目半天没读明白,还有这么多人回答, 我觉得我脑子有问题
|
59
zjsxwc Aug 24, 2021
如果不能用数据库等存储(文件系统也算数据库)的话,
每 10 秒恒定就说明你这个随机数是由你当前时间确定的,于是你这个随机根本就不是随机数! 如果不是随机数,那么解决楼主需求的办法确实只有用 rsa 非对称加密办法了,最多就是密钥每天换一个新的。 |
60
pckillers Aug 24, 2021
@zjsxwc 把年月日也加进判断不就得了。 日期 + 时间(精确到 10 分钟) + 字符 做个 MD5 再随便想个公式变回数字。 也看起来差不多像随机数了。
|
61
raysonlu Aug 25, 2021
就题目看,明显就 if else 完事,但感觉明显就是题目需求都没有说清楚
|