Функция на PLSQL

 
0
 
Oracle
ava
dartx | 06.04.2006, 12:40
по правилу:
- случайная согласная буква латинская маленькая
- случайная гласная буква латинская маленькая
- случайная цифра
- с 50% вероятностью:
- или случайная цирфа
- или случайные согласная+гласная буква
- случайная цирфа
- случайные согласная+гласная буква


Как можно реализовать?
Comments (10)
ava
jsa | 07.04.2006, 08:35 #
не совсем понял задачу, нужно генератор паролей сделать?
ava
dartx | 07.04.2006, 09:08 #
Цитата (jsa @ 7.4.2006, 08:35)
не совсем понял задачу, нужно генератор паролей сделать?

Ну да, именно это.
ava
LSD | 07.04.2006, 10:22 #
Самый простой способ написать ее на Java, что-то типа:
create or replace and compile java source named PWD_GEN_J as
import java.util.Random;

public class PasswordGenerator
{
public static final char[] LATIN_UPPERCASE =
{'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'};

public static final char[] LATIN_LOWERCASE =
{'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'};

public static final char[] DIGITS =
{'0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9'};

public static final char[] SYMBOLS =
{'!' , '@' , '#' , '$' , '%' , '^' , '&' , '*' , '(' , ')' , '_' , '+' , '-' , '=' , '[' ,
']' , '{' , '}' , ';' , '\'' , ':' , '"' , ',' , '.' , '/' , '<' , '>' , '?' , '`' , '~'};

private static Random rnd = new Random();

public static String generate(int length, boolean latinUpper, boolean latinLower, boolean digits, boolean symbols)
{
int l = latinUpper ? LATIN_UPPERCASE.length : 0;
l += latinLower ? LATIN_LOWERCASE.length : 0;
l += digits ? DIGITS.length : 0;
l += symbols ? SYMBOLS.length : 0;

if(l == 0)
throw new IllegalArgumentException("No symbols selected");

char[] sym = new char[l];
l = 0;
if(latinUpper)
{
System.arraycopy(LATIN_UPPERCASE, 0, sym, l, LATIN_UPPERCASE.length);
l += LATIN_UPPERCASE.length;
}
if(latinLower)
{
System.arraycopy(LATIN_LOWERCASE, 0, sym, l, LATIN_LOWERCASE.length);
l += LATIN_LOWERCASE.length;
}
if(digits)
{
System.arraycopy(DIGITS, 0, sym, l, DIGITS.length);
l += DIGITS.length;
}
if(symbols)
{
System.arraycopy(SYMBOLS, 0, sym, l, SYMBOLS.length);
l = SYMBOLS.length;
}

StringBuffer buffer = new StringBuffer(length);
for(int i = 0; i < length ; i++)
buffer.append(sym[rnd.nextInt(sym.length)]);

return buffer.toString();
}
}
/

create or replace function GENERATE_PASSWORD(length          number,
latin_uppercase boolean,
latin_ljwercase boolean,
digits boolean,
symbols boolean)
return varchar2 as
language java name 'PasswordGenerator.generate(int, boolean, boolean, boolean, boolean) return java.lang.String';
ava
dartx | 07.04.2006, 17:41 #
В том-то и дело, что проще на джава, а надо на PL/SQL, абыдна однако:(
Я в PL/SQL как-то не очень.
ava
LSD | 07.04.2006, 22:47 #
Цитата (dartx @ 7.4.2006, 18:41 findReferencedText)
надо на PL/SQL, абыдна однако

Почему?!
Oracle, начиная с версии 8i, спокойно поддерживает Java, без всяких дополнительных ухищрений. Зачем создавать себе трудности, а затем их с честью преодолевать?
ava
dartx | 08.04.2006, 13:18 #
Ну дело в том что почти вся бизнес логика реализована на PL/SQL, и почти вся работа связанна с ним. Со своим уставом в чужой монастырь не пойдешь ведь?

Ну я пока разобрался со рандомом и делаю примерно так:

DBMS_RANDOM.initialize(DBMS_UTILITY.get_time);
pcnt := 26;
Result := pcnt * BITAND(ABS(DBMS_RANDOM.random), 65535) / 65535;


Теперь надо разобраться со строками в PL/SQL:
Самое неприятное, что пароль должен генирироваться по правилам.
То есть есть мысль создать три массива символов: с полным набором символов(гласные, согласные, цифры),
только гласные, только согласные, цифры. Потом случайно выбрать из полного набора, затем анализируя выбранный символ, ставить либо из гласных, либо из согласных, либо из цифр.
ava
LSD | 08.04.2006, 14:24 #
Можно получить с помощью ASCII получить диапазон кодов символов, затем генерируем число из диапазона и с помощью CHR делаем из него строку:
declare
BEG_IDX number;
END_IDX number;
RND number;
RES varchar2;
begin
BEG_IDX := ASCII('A');
END_IDX := ASCII('Z');
....
RES := RES || CHR(RND);
end;
/
ava
dartx | 08.04.2006, 18:20 #
Да но ведь тогда будет генирится пароль просо из случайных чисел, а надо по правилу, например:
acedeh или merotj, ну и так далее, чтобы были легко запоминаюшимися.
ava
LSD | 09.04.2006, 15:14 #
Это только набросок. Я просто показал как сгенерировать букву из заданного множества. А дальше уже генерируешь пароль по своим правилам:
  • случайная согласная буква латинская маленькая
  • случайная гласная буква латинская маленькая
  • случайная цифра
  • ....
ava
dartx | 09.04.2006, 18:21 #
Спасибо за помощь!
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  LSD   jsa   dartx
advanced
Submit