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