我想用下面的函数为员工生成一个随机密码。这是我第一次尝试使用 R 中的函数。所以我需要一些帮助。
genPsw <- function(num, len=8) {
# Vorgaben für die Passwortkonventionen festlegen
myArr <- c("", 2, 3, 4, 5, 6, 7, 8, 9, "A", "B",
"C", "D", "E", "F", "G", "H", "J", "K", "L", "M",
"N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"!", "§", "$", "%", "&", "(", ")", "*")
# replicate is a wrapper for the common use of sapply for repeated evaluation of an expression
# (which will usually involve random number generation).
replicate(num, paste(sample(myArr, size=len, replace=T), collapse=""))
# nrow of dataframe mitarbeiter
dim_mitarbeiter <- nrow(mitarbeiter)
for(i in 1:dim_mitarbeiter) {
# Random Number Generation with i
set.seed(i)
# Generate Passwort for new variable password
mitarbeiter$passwort <- genPsw(i)
}
}
有了答案表 Floo0,我已经将函数更改为类似的东西,但它不起作用:
genPsw <- function(num, len=8) {
# Vorgaben für die Passwortkonventionen festlegen
sam<-list()
sam[[1]]<-1:9
sam[[2]]<-letters
sam[[3]]<-LETTERS
sam[[4]]<-c("!", "§", "$", "%", "&", "(", ")", "*")
# nrow of dataframe mitarbeiter
dim_mitarbeiter <- nrow(mitarbeiter)
for(i in 1:dim_mitarbeiter) {
# Random Number Generation with i
tmp<-mapply(sample,sam,c(2,2,2,2))
# Generate Passwort for new variable password
mitarbeiter$passwort <- paste(sample(tmp),collapse="")
}
}
怎么样
samp<-c(2:9,letters,LETTERS,"!", "§", "$", "%", "&", "(", ")", "*")
paste(sample(samp,8),collapse="")
结果是这样的
"HKF§VvnD"
注意: 此方法不强制使用大写字母、数字和非字母数字符号
编辑:
如果你想强制使用一定数量的大写字母、数字和非字母数字符号,你可以这样做:
sam<-list()
sam[[1]]<-1:9
sam[[2]]<-letters
sam[[3]]<-LETTERS
sam[[4]]<-c("!", "§", "$", "%", "&", "(", ")", "*")
tmp<-mapply(sample,sam,c(2,2,2,2))
paste(sample(tmp),collapse="")
其中
c(2,2,2,2)
指定数字、字母、大写字母和symbild的数量(按此顺序)。结果:
[1] "j$bP%5R3"
编辑2: 要在你的表中生成一个新列
mitarbeiter
只需使用
passwort<-replicate(nrow(mitarbeiter),paste(mapply(sample,sam,c(2,2,2,2)),collapse=""))
mitarbeiter$passwort<-passwort
stringi包中有生成随机字符串的函数:
require(stringi)
stri_rand_strings(n=2, length=8, pattern="[A-Za-z0-9]")
## [1] "90i6RdzU" "UAkSVCEa"
这可能行得通,可能需要更改
ASCII
以避免不需要的符号:
generatePwd <- function(plength=8, ASCII=c(33:126)) paste(sapply(sample(ASCII, plength), function(x) rawToChar(as.raw(x))), collapse="")
以下脚本根据大小写字母、数字和 32 个符号(标点符号等)的组合创建指定长度的密码。
# Store symbols as a vector in variable punc
R> library(magrittr) # Load this package to use the %>% (pipe) operator
R> punc_chr <- "!#$%&’()*+,-./:;<=>?@[]^_`{|}~" %>%
str_split("", simplify = TRUE) %>%
as.vector() -> punc
# Randomly generate specified number of characters from 94 characters
R> sample(c(LETTERS, letters, 0:9, punc), 8) %>%
paste(collapse = "") -> pw
R> pw # Return password
[1] "fAXVpyOs"
我喜欢 L.R. 解决方案的简洁性,尽管我没有 100% 遵循它的作用。
我的解决方案允许指定密码的长度,但也确保至少包含一个小写字母、一个大写字母、一个数字和一个特殊字符,并允许重现。 (ht to moazzem 拼出所有特殊字符。)
gen_pass <- function(len=8,seeder=NULL){
set.seed(seeder) # to allow replicability of passw generation
# get all combinations of 4 nums summing to length len
all_combs <- expand.grid(1:(len-3),1:(len-3),1:(len-3),1:(len-3))
sum_combs <- all_combs[apply(all_combs, 1, function(x) sum(x)==len),]
# special character vector
punc <- unlist(strsplit("!#$%&’()*+,-./:;<=>?@[]^_`{|}~",""))
# list of all characters to sample from
chars <- list(punc,LETTERS,0:9,letters)
# retrieve the number of characters from each list element
# specified in the sampled row of sum_combs
pass_chars_l<- mapply(sample, chars,
sum_combs[sample(1:nrow(sum_combs),1),],
replace = TRUE)
# unlist sets of password characters
pass_chars <- unlist(pass_chars_l)
# jumble characters and combine into password
passw <- str_c(sample(pass_chars),collapse = "")
return(passw)
}
我还在想
(1:(len-3),1:(len-3),1:(len-3),1:(len-3))
中的expand.grid(1:(len-3),1:(len-3),1:(len-3),1:(len-3))
怎么表达得更优雅?
刚试过Fmerhout提出的功能。这似乎是一个很好的解决方案。多谢。但是因为最后一行代码:
passw <- str_c (sample (pass_chars), collapse = "")
功能不工作。 我试过了:
passw <- str (sample (pass_chars), collapse = "")
...现在它起作用了:
种子示例:
>gen_pass(4,2)
给出:chr [1:4] "y" "[" "O" "1"
为了获取直接可用的密码,我把代码末尾改成这样:
zz <- sample(pass_chars)
passw <- paste(zz, sep = "", collapse = "")
return(passw)
}
所以,现在我们得到例如:
> gen_pass(35, 2)
[1] "0OD}1O}8DKMqTL[JEFZBwKMJWGD’VZ=VRnD"
很有趣;因为我们只需要记住传递给函数的参数。在这里,在这种情况下:35 2。 谢谢 Fmerhout 先生.
总结:通过这个小脚本,我们有一个很好的方法来创建非常强大和非常安全的密码,具有良好的熵,而无需使用字典,也不必在任何地方记录我们的密码。
这会生成随机的小写字母和数字,但如果您愿意,可以在其中嵌套另一个带有特殊字符/大写字母向量的粘贴。
paste0(paste(sample(letters, 7), collapse = ""), paste(sample(99999, 1)))