Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Функция на PLSQL


Автор: dartx 6.4.2006, 11:40
по правилу:
- случайная согласная буква латинская маленькая
- случайная гласная буква латинская маленькая
- случайная цифра
- с 50% вероятностью:
- или случайная цирфа
- или случайные согласная+гласная буква
- случайная цирфа
- случайные согласная+гласная буква


Как можно реализовать?

Автор: jsa 7.4.2006, 08:35
не совсем понял задачу, нужно генератор паролей сделать?

Автор: dartx 7.4.2006, 09:08
Цитата(jsa @ 7.4.2006, 08:35)
не совсем понял задачу, нужно генератор паролей сделать?

Ну да, именно это.

Автор: LSD 7.4.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';

Автор: dartx 7.4.2006, 17:41
В том-то и дело, что проще на джава, а надо на PL/SQL, абыдна однакоsmile
Я в PL/SQL как-то не очень.

Автор: LSD 7.4.2006, 22:47
Цитата(dartx @ 7.4.2006, 18:41 Найти цитируемый пост)
надо на PL/SQL, абыдна однако

Почему?!
Oracle, начиная с версии 8i, спокойно поддерживает Java, без всяких дополнительных ухищрений. Зачем создавать себе трудности, а затем их с честью преодолевать?

Автор: dartx 8.4.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:
Самое неприятное, что пароль должен генирироваться по правилам.
То есть есть мысль создать три массива символов: с полным набором символов(гласные, согласные, цифры),
только гласные, только согласные, цифры. Потом случайно выбрать из полного набора, затем анализируя выбранный символ, ставить либо из гласных, либо из согласных, либо из цифр.

Автор: LSD 8.4.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;
/

Автор: dartx 8.4.2006, 18:20
Да но ведь тогда будет генирится пароль просо из случайных чисел, а надо по правилу, например:
acedeh или merotj, ну и так далее, чтобы были легко запоминаюшимися.

Автор: LSD 9.4.2006, 15:14
Это только набросок. Я просто показал как сгенерировать букву из заданного множества. А дальше уже генерируешь пароль по своим правилам:
  • случайная согласная буква латинская маленькая
  • случайная гласная буква латинская маленькая
  • случайная цифра
  • ....

Автор: dartx 9.4.2006, 18:21
Спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)