滑动窗口算法以及应用

news/2024/9/25 16:23:31/文章来源:https://www.cnblogs.com/lovebing/p/18431583

滑动窗口算法以及应用

主要涉及以下几个关键参数和概念:

  1. 窗口大小(Window Size):这是滑动窗口的宽度,决定了窗口中包含的数据点数量。例如,如果你在处理时间序列数据,窗口大小可能定义为秒、分钟或小时的数量。

  2. 窗口位置(Window Position):由左右边界(通常是两个指针)定义的窗口在数据序列中的当前位置。左指针标志着窗口的起始位置,右指针则是结束位置。

  3. 滑动步长(Slide Step/Stride):每次移动窗口时跨越的数据单位数量。步长可以等于窗口大小,导致窗口逐个数据单位移动,也可以小于窗口大小,实现重叠窗口,或者大于窗口大小,但通常步长不会大于窗口大小,否则窗口内的数据会不连续。

  4. 数据序列(Data Sequence):滑动窗口在其上进行操作的一系列数据,可以是数组、字符串、时间序列数据等。

  5. 目标函数(Objective Function):滑动窗口内的数据会被用来计算或评估某个特定的值或条件,比如寻找最大值、最小值、平均值、特定模式等。

  6. 初始化(Initialization):窗口如何开始其第一次滑动,通常是将左右指针设置在数据序列的起始位置。

  7. 更新策略(Update Strategy):随着窗口向右滑动,如何添加新数据到窗口以及移除旧数据,保持窗口内数据的实时性。

通过调整这些参数,滑动窗口算法可以应用于诸如流量控制、速率限制、趋势分析、数据平滑、模式匹配等多种场景。

应用

要实现一个登录失败后的账户锁定功能,并设置锁定时间,可以根据不同的编程语言和平台采用不同的策略。以下是一个基于Web应用(以PHP为例)的简单实现思路,以及一个针对Linux服务器(使用PAM模块)的配置方法。

PHP实现

  1. 数据库设计:首先确保用户表中有记录登录失败次数和最后一次失败时间的字段,如login_attemptslast_failed_attempt

  2. 登录验证逻辑

    • 在用户登录验证的逻辑中,首先检查login_attempts是否超过了设定的阈值,比如5次。
    • 如果未超过,验证用户名和密码。如果验证失败,增加login_attempts计数,并记录last_failed_attempt时间。
    • 如果超过,比较当前时间和last_failed_attempt,判断是否已达到锁定时间。如果未达到锁定时间,拒绝登录并提示账户已被锁定。如果已超过锁定时间,重置login_attempts为0,允许尝试登录。
  3. 锁定时间计算:可以在验证逻辑中加入根据失败次数动态调整锁定时间的代码,例如首次锁定30分钟,之后每次失败延长锁定时间。

结合滑动窗口的概念来实现登录失败后的账户锁定机制,我们可以将滑动窗口算法应用于记录和管理用户登录失败的尝试。这种情况下,滑动窗口可以用来跟踪一段时间内(而非累计次数)的登录失败情况,提供一种更灵活的账户保护策略,避免因历史失败尝试长期累积导致的账户长期被锁。

设计思路

  1. 窗口定义:定义一个时间窗口,比如过去15分钟内。在这个时间窗口内,记录用户的登录失败次数。

  2. 窗口滑动与更新:每当有新的登录尝试时,检查此次尝试的时间戳。如果这次尝试使得最早的失败尝试超出了窗口范围(比如尝试发生在15分钟以前),则从失败计数中移除这一条记录,保证窗口始终保持最新15分钟内的数据。

  3. 锁定逻辑:当窗口内的失败尝试次数达到预设阈值(如5次)时,触发账户锁定。锁定时间可以是固定的(如30分钟),或者动态根据窗口内失败次数调整。

  4. 解锁机制:一旦锁定时间到期,账户自动解锁,或者允许用户通过额外的身份验证(如邮箱验证码)手动请求解锁。

实现示例(伪代码)

class LoginSecurity:def __init__(self):self.failed_attempts = []  # 存储失败登录的timestampself.threshold = 5         # 失败尝试阈值self.lock_duration = 1800  # 锁定时长,单位秒self.window_size = 900     # 窗口大小,单位秒def login_attempt(self, timestamp):self._prune_attempts(timestamp)  # 移除窗口外的旧尝试if len(self.failed_attempts) >= self.threshold:  # 达到阈值lock_until = timestamp + self.lock_durationprint(f"Account locked until {lock_until}")return True  # 表示账户应被锁定else:self.failed_attempts.append(timestamp)return False  # 尝试未达阈值,继续处理登录逻辑def _prune_attempts(self, current_timestamp):"""移除窗口外的旧登录失败记录"""while self.failed_attempts and (current_timestamp - self.failed_attempts[0]) > self.window_size:self.failed_attempts.pop(0)# 使用示例
security = LoginSecurity()
current_time = time.time()  # 假设是当前时间戳
if security.login_attempt(current_time):# 执行账户锁定逻辑
else:# 继续验证登录信息

我们使用滑动窗口管理登录失败尝试,并根据最近的失败频率,而不是累积次数来决定是否锁定账户,提供了更加动态和用户友好的安全策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803533.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI自动生成代码注释

在vscode 中安装 TONGYI Lingma

通过 Tampermonkey 实现学习通全自动刷课

本文介绍了如何使用 Tampermonkey 这一流行的用户脚本管理器,通过其脚本库实现学习通的全自动刷课。文章详细讲解了 Tampermonkey 的安装步骤、OCS 脚本的配置方法,以及题库的使用流程,帮助读者高效完成学习任务。在学习过程中,自动化工具能大大提升学习效率。Tampermonkey…

KBU1010-ASEMI单向整流桥KBU1010

KBU1010-ASEMI单向整流桥KBU1010编辑:ll KBU1010-ASEMI单向整流桥KBU1010 型号:KBU1010 品牌:ASEMI 封装:KBU-4 批号:2024+ 类型:单向整流桥 电流(ID):10A 电压(VF):1000V 安装方式:直插式封装 特性:大功率、整流扁桥 产品引线数量:4 产品内部芯片个数:4 产品内部…

Kubernetes中Ingress的原理和配置

Ingress的概念和作用 Ingress是Kubernetes集群中的一个对象,用于将外部流量路由到集群内部的服务。它充当了进入Kubernetes集群的API网关,负责接收外部请求,并将其转发到正确的目标服务上。 Ingress通常通过HTTP和HTTPS提供对服务的访问,并支持基于主机名、路径以及其他HTT…

《如 何 速 通 一 套 题》4.0

A sprial 找规律。直接做。 #include <bits/stdc++.h> #define int long long using namespace std;int t, n;int sqrtll(int n) {int l = 1, r = 1000000, ans = 0;for(; l <= r; ) {int mid = (l + r) >> 1;if(mid * mid >= n) {ans = mid, r = mid - 1;}e…

自定义表格样式

HTML:<div class="table-container"><table style="width: 90%; margin-left: 5%"><tr class="table-title"><th style="width: 33%">科室名称</th><th style="width: 33%">当日登录次…

Bash脚本基本语法

一、Bash脚本以及相关介绍Bash脚本是一种在Unix或Linux操作系统中广泛使用的脚本语言,它允许用户编写一系列命令,这些命令将被Bash(Bourne-Again SHell)解释器执行。Bash脚本可以用于自动化各种任务,比如文件管理、程序执行、系统维护等。 编写Bash脚本的基本步骤包括:创…

【vulhub】Discuz-任意文件删除

【vulhub】Discuz-任意文件删除 0x00漏洞介绍 通过配置个人信息的属性值,导致文件删除。 影响版本Discuz <= 3.40x01 搭建环境 数据库服务器填写db(必须db,不然安装失败),数据库名为discuz,数据库账号密码均为root,管理员密码任意。填写联系方式页面直接点击跳过本步…

2024年开源API工具盘点,覆盖API全生命周期

2024年经济持续低迷,本文整理一些免费的开源工具,旨在帮助企业组织降低工具的支出成本,能用免费的何必用付费的呢(狗头)? 如何高效地管理API的全生命周期——从设计、开发、测试、部署到监控和优化,已经成为每个开发者和技术团队关注的重点。以下工具清单,无论你是刚刚…

Day4 与用户交互 + 格式化运算符 + 基本运算符

今天首先对昨天学的进行了复习,由这个复习可以看出昨天的我是多么的水*-*,今天的话倒是学的挺充实的,因为没有像上节课的jupyter notebook那样的东西(这节课看下来还是挺牛的,但也没到非用不可的时候,继续放着吧)。今天主要学习了三大部分,与用户的交互,格式化占位符,…

ACCESS 关于MSCOMCT2.OCX和MSCOMCTL.OCX报错的解决方案

我在ACCESS中添加了TreeView插件,结果电脑A上打开没问题,电脑B打开时就报MSCOMCT2.OCX和MSCOMCTL.OCX有错. B电脑之前是可以正常使用的,但是加了TreeView插件之后报错,说明是插件引用的问题. 在网上下载了这两个文件,复制到C:\WINDOWS\SYSTEM32目录下. 重新注册了这两个文件: 以…

74hc595

74htc595 功能 8位串行输入 8位串行或并行输出 带3态输出的存储 寄存器带直接清零的移位寄存器100 MHZ(典型) 移出频率 ESD保护H BM ELAJESD22-A114-A超过2000VMM EIAJESD23-A115-A超过200 V说明 74HC/HCT595是高速硅栅CMOS器件, 与低功率肖特基TTLLSTTL引脚兼容。 它们是根…