PostgreSQL密码生成器

3

我需要一些关于SQL口令生成器的帮助。我已经有一个返回8个随机字符的函数,但我需要确保包含小写字母、大写字母和数字。有什么建议吗?这是我的旧函数。

CREATE FUNCTION f_generate_password() RETURNS text AS $$
DECLARE
   password text;
   chars text;
BEGIN
   password := '';
   chars := 
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
   FOR i IN 1..8 LOOP
     password := password || SUBSTRING(chars, 
ceil(random()*LENGTH(chars))::integer, 1);
   END LOOP;
   return password;
END;
$$
LANGUAGE plpgsql;
2个回答

2

这里有一个针对那些遇到相同或类似问题的解决方案 :)

CREATE OR REPLACE FUNCTION f_generate_password()
  RETURNS text AS
$BODY$
DECLARE
   vPassword text;
   chars text;
BEGIN
   vPassword := ''; 
   chars := 
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  WHILE((select COALESCE(substring(vPassword from '.*[a-z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[A-Z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[0-9]+.*'),'')) = '') LOOP
  vPassword := '';
   FOR i IN 1..8 LOOP
     vPassword := vPassword || SUBSTRING(chars, ceil(random()*LENGTH(chars))::integer, 1);
  END LOOP;
   END LOOP;
   return vPassword;
END;
$BODY$
  LANGUAGE plpgsql;

0

如果你对一个算法感到困惑......我不知道PostgreSQL的语法/方言,但是你可以:

1)选择 3 个随机位置(1 到 8),并在那里放置 3 个随机小写字母
2)从剩下的位置中选择 3 个随机位置,并在那里放置 3 个随机大写字母
3)在剩下的两个位置上放置 2 个随机数字。


嗯,我知道那个,我只是想要用SQL语法来表达它 :) 但我已经做到了...我在这里粘贴代码只是为了帮助其他遇到同样问题的人 :) - Martin Svancar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接