-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrandomStr.js
109 lines (107 loc) · 3.77 KB
/
randomStr.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
*
* @param start {number}
* @param end {number}
* @return {number}
*/
Array.prototype.sum = function (start, end) {
return this.reduce((total, currentValue, currentIndex) => {
if (currentIndex >= start && currentIndex < end) {
return total + currentValue;
}
return total;
}, 0)
}
const shuffle = function (arrBox) {
arrBox = typeof arrBox === 'string' ? arrBox.split('') : arrBox
let shuffleBox = []
let len = arrBox.length
for (let i = 0; i < len; i++) {
let boxIndex = Math.floor(Math.random() * arrBox.length)
shuffleBox.push(arrBox[boxIndex].valueOf())
arrBox.splice(boxIndex, 1)
}
return shuffleBox
}
/**
* @param len
* @param chars
* @returns {string}
*/
const randStr = (len, chars = []) => {
chars = chars || []
const str = shuffle(chars.join("")).join("")
let randFull = shuffle(str + str + str + str + str + str + str).join("");
return randFull.substring(0, len);
}
export const CHARS = {
'ABC_XYZ': 'ABCDEFGHIGKLMNOPKRSTUVWXYZ',
'abc_xyz': 'abcdefghigklmnopkrstuvwxyz',
'1234567890': '1234567890',
'!@#$%^&*()_': '!@#$%^&*()_',
'+.(~)[]?}|{][,-': '+.(~)[]?}|{][,-',
}
/**
* random a string
* @param len number
* @param chars {string[]}
* @param upperCase {boolean}
* @param separator {string}
* @param separatorSteps {number[]|number}
* @return {string}
*/
export const randomStr = (len = 16,
chars = [],
upperCase = false,
separator = "",
separatorSteps = 4,
) => {
chars = chars.length === 0 ? [
CHARS.ABC_XYZ,
CHARS.abc_xyz,
CHARS["1234567890"],
CHARS["+.(~)[]?}|{][,-"],
CHARS["!@#$%^&*()_"]] : chars;
let str = randStr(len, chars);
if (separator) {
let regex = null
if (Array.isArray(separatorSteps)) {
separatorSteps.push(str.length)
str = separatorSteps.map((pos, index) => str.substring(separatorSteps.sum(0, index), separatorSteps.sum(0, index + 1))).join(separator)
} else {
regex = new RegExp('(.{' + separatorSteps + '})(?!$)', 'g')
str = str.replace(regex, "$1 ").split(" ").join(separator)
}
}
return upperCase ? str.toUpperCase() : str;
}
export const ABC = (len = 16,
separator = "",
separatorSteps = 4) => {
return randomStr(len, [CHARS.ABC_XYZ], false, separator, separatorSteps)
}
export const Number = (len = 16,
separator = "",
separatorSteps = 4) => {
return randomStr(len, [CHARS["1234567890"]], false, separator, separatorSteps)
}
export const abc = (len = 16, separator = "",
separatorSteps = 4) => {
return randomStr(len, [CHARS.abc_xyz], false, separator, separatorSteps)
}
export const ABC_abc = (len = 16, separator = "",
separatorSteps = 4) => {
return randomStr(len, [CHARS.ABC_XYZ, CHARS.abc_xyz], false, separator, separatorSteps)
}
export const ABC_abc_123 = (len = 16, separator = "",
separatorSteps = 4) => {
return randomStr(len, [CHARS.ABC_XYZ, CHARS.abc_xyz, CHARS["1234567890"]], false, separator, separatorSteps)
}
export const strongPasswd = (len = 16, separator = "",
separatorSteps = 4) => {
return randomStr(len, [CHARS.ABC_XYZ, CHARS.abc_xyz, CHARS["1234567890"], CHARS["!@#$%^&*()_"]], false, separator, separatorSteps)
}
export const superPasswd = (len = 16, separator = "",
separatorSteps = 4) => {
return randomStr(len, [CHARS.ABC_XYZ, CHARS.abc_xyz, CHARS["1234567890"], CHARS["+.(~)[]?}|{][,-"], CHARS["!@#$%^&*()_"]], false, separator, separatorSteps)
}