我的任务是创建一个密码验证,必须考虑一些事情。我遇到的唯一问题是,密码验证的标准之一是密码不能包含任何序列,例如。(12345),(abcdef),(asdfghjk).我已经搜索了很多,不知道如何实现这一点。有人能帮忙吗。
gblwokeq1#
由于您没有给予太多关于您已经拥有的代码以及您在逻辑上遇到的问题的细节,因此这里有一个非常概括的策略描述,您可以使用它来做到这一点:1.创建一个List<Iterable<Char>>,其中包含所有可能被视为范围的字符串。举例来说:
List<Iterable<Char>>
val charRuns = listOf( '0'..'9', 'a'..'z', 'A'..'Z', "qwertyuiop".asIterable(), //... )
1.迭代这些游程以填充MutableMap<Char, MutableSet<Char>>,其中键是游程中的任何字符,值是所有字符的集合,如果它们出现在字符串中的下一个,则应被视为连续序列。1.迭代潜在的密码String,使用Map来检查每个Char的后续Char,看看它是否应该被视为序列的一部分。使用一个计数器变量来计算到目前为止找到的序列的当前大小,并在发现非序列时重置它。如果它超过了允许的序列大小阈值,请立即拒绝密码。
MutableMap<Char, MutableSet<Char>>
w7t8yxp52#
这就是我如何实现它。我还检查了是否有反向序列,例如(4321,dcba)。
private fun noSequenzes(password: String) : Boolean { val charRuns = listOf( '0'..'9', 'a'..'z', 'A'..'Z', "qwertzuiop".asIterable(), "asdfghjklöä".asIterable(), "yxcvbnm".asIterable() ) var map = emptyMap<Char, MutableSet<Char?>>() charRuns.forEach { run -> run.forEach { char -> val charsToAdd = mutableSetOf(run.elementAtOrNull(run.indexOf(char) + 1)) if (run is CharRange) { charsToAdd.add(run.elementAtOrNull(run.indexOf(char) - 1)) } if (map.contains(char)) { map.get(char)!!.addAll(charsToAdd) } else { map = map.plus(Pair(char, charsToAdd)) } } } var sequenceCounter = 1 var recentChar: Char? = null password.toCharArray().forEach { c -> recentChar?.let { rc -> val isSequence = map.any { me -> me.key == rc && me.value.contains(c) } if (isSequence) { sequenceCounter = sequenceCounter + 1 } else { sequenceCounter = 1 } if (sequenceCounter >= 3) { return false } } recentChar = c } return true }
shyt4zoc3#
时间锁定登录验证创建变量
private lateinit var editTextUsername: EditText private lateinit var editTextPassword: EditText private lateinit var buttonLogin: Button private var attemptsLogin = 0 private val handler: Handler = Handler() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportActionBar?.hide() setContentView(R.layout.activity_main) editTextUsername = findViewById(R.id.editTextUsername) editTextPassword = findViewById(R.id.editTextPassword) buttonLogin = findViewById(R.id.buttonLogin) }
创建逻辑
fun loginButtonClicked(view: View) { val user = editTextUsername.text.toString() val password = editTextPassword.text.toString() if (user == "User" && password== "password") { startActivity(Intent(this, screen_home::class.java)) finish() } else { attemptsLogin++ if (attemptsLogin >= 3) { loginBloked() handler.postDelayed({ attemptsLogin = 0 }, 2000) } else { Toast.makeText(this, "User/Password Invalid !", Toast.LENGTH_SHORT).show() } } } private fun loginBloked() { editTextUsername.backgroundTintList = resources.getColorStateList(R.color.red) editTextPassword.backgroundTintList = resources.getColorStateList(R.color.red) editTextUsername.text.clear() editTextPassword.text.clear() arrayOf(editTextUsername, editTextPassword).forEach { it.isEnabled = false } arrayOf(buttonLogin).forEach { it.isEnabled = false } Toast.makeText(this, "wait 2s!", Toast.LENGTH_SHORT).show() handler.postDelayed({ arrayOf(editTextUsername, editTextPassword).forEach { it.isEnabled = true } arrayOf(buttonLogin).forEach { it.isEnabled = true } }, 2000) }
记住xml:
android:onClick="loginButtonClicked"
3条答案
按热度按时间gblwokeq1#
由于您没有给予太多关于您已经拥有的代码以及您在逻辑上遇到的问题的细节,因此这里有一个非常概括的策略描述,您可以使用它来做到这一点:
1.创建一个
List<Iterable<Char>>
,其中包含所有可能被视为范围的字符串。举例来说:1.迭代这些游程以填充
MutableMap<Char, MutableSet<Char>>
,其中键是游程中的任何字符,值是所有字符的集合,如果它们出现在字符串中的下一个,则应被视为连续序列。1.迭代潜在的密码String,使用Map来检查每个Char的后续Char,看看它是否应该被视为序列的一部分。使用一个计数器变量来计算到目前为止找到的序列的当前大小,并在发现非序列时重置它。如果它超过了允许的序列大小阈值,请立即拒绝密码。
w7t8yxp52#
这就是我如何实现它。我还检查了是否有反向序列,例如(4321,dcba)。
shyt4zoc3#
时间锁定登录验证
创建变量
创建逻辑
记住xml: