密码验证无字符序列(kotlin android studio)
password validation no Character sequence ( kotlin android studio )
我的任务是创建一个必须考虑一些事情的密码验证。我唯一的问题是密码验证的标准之一是密码不能包含任何序列,例如(12345)、(abcdef)、(asdfghjk)。我已经搜索了很多,不知道如何实现。谁能帮忙。
由于您没有详细说明您已经拥有的代码以及您对逻辑的坚持,这里是您可以用来执行此操作的策略的非常笼统的描述:
- 创建一个
List<Iterable<Char>>
,其中包含可以被视为一个范围的所有可能的字符串。例如:
val charRuns = listOf(
'0'..'9',
'a'..'z',
'A'..'Z',
"qwertyuiop".asIterable(),
//...
)
迭代这些运行以填充 MutableMap<Char, MutableSet<Char>>
,其中键是运行中的任何字符,值是所有字符的集合,如果它们出现在下一个字符串应该被认为是一个连续的序列。
迭代潜在的密码String,使用map检查每个Char的后续Char,看看它是否应该被认为是序列的一部分。使用计数器变量来计算到目前为止找到的序列的当前大小,并在找到 non-sequence 时重置它。如果它超过允许的序列大小阈值,请立即拒绝密码。
我就是这样实现的。
我还检查是否没有向后的序列,例如 (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
}
我的任务是创建一个必须考虑一些事情的密码验证。我唯一的问题是密码验证的标准之一是密码不能包含任何序列,例如(12345)、(abcdef)、(asdfghjk)。我已经搜索了很多,不知道如何实现。谁能帮忙。
由于您没有详细说明您已经拥有的代码以及您对逻辑的坚持,这里是您可以用来执行此操作的策略的非常笼统的描述:
- 创建一个
List<Iterable<Char>>
,其中包含可以被视为一个范围的所有可能的字符串。例如:
val charRuns = listOf(
'0'..'9',
'a'..'z',
'A'..'Z',
"qwertyuiop".asIterable(),
//...
)
迭代这些运行以填充
MutableMap<Char, MutableSet<Char>>
,其中键是运行中的任何字符,值是所有字符的集合,如果它们出现在下一个字符串应该被认为是一个连续的序列。迭代潜在的密码String,使用map检查每个Char的后续Char,看看它是否应该被认为是序列的一部分。使用计数器变量来计算到目前为止找到的序列的当前大小,并在找到 non-sequence 时重置它。如果它超过允许的序列大小阈值,请立即拒绝密码。
我就是这样实现的。 我还检查是否没有向后的序列,例如 (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
}