PostgreSQL에서 세션 ID에 적합한 임의 문자열을 어떻게 생성합니까?
PostgrePostgre를 사용하여 세션 SQL. 나는 내가 임의의 숫자를 얻을 수 있다는 것을 알고 있습니다.SELECT random()그래서 노력했습니다.SELECT md5(random())하지만 그것은 효과가 없습니다.어떻게 해야 하나요?
다음과 같이 초기 시도를 수정할 수 있습니다.
SELECT md5(random()::text);
다른 몇몇 제안들보다 훨씬 더 간단합니다. :-)
다음과 같은 간단한 해결책을 제안합니다.
이 함수는 주어진 길이의 임의 문자열을 반환하는 매우 간단한 함수입니다.
Create or replace function random_string(length integer) returns text as
$$
declare
chars text[] := '{0,1,2,3,4,5,6,7,8,9,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,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}';
result text := '';
i integer := 0;
begin
if length < 0 then
raise exception 'Given length cannot be less than 0';
end if;
for i in 1..length loop
result := result || chars[1+random()*(array_length(chars, 1)-1)];
end loop;
return result;
end;
$$ language plpgsql;
사용법:
select random_string(15);
출력 예:
select random_string(15) from generate_series(1,15);
random_string
-----------------
5emZKMYUB9C2vT6
3i4JfnKraWduR0J
R5xEfIZEllNynJR
tMAxfql0iMWMIxM
aPSYd7pDLcyibl2
3fPDd54P5llb84Z
VeywDb53oQfn9GZ
BJGaXtfaIkN4NV8
w1mvxzX33NTiBby
knI1Opt4QDonHCJ
P9KC5IBcLE0owBQ
vvEEwc4qfV4VJLg
ckpwwuG8YbMYQJi
rFf6TchXTO3XsLs
axdQvaLBitm6SDP
(15 rows)
UUID에서 128비트의 랜덤을 얻을 수 있습니다.이것은 현대 포스트그레에서 일을 끝내는 방법입니다.SQL.
CREATE EXTENSION pgcrypto;
SELECT gen_random_uuid();
gen_random_uuid
--------------------------------------
202ed325-b8b1-477f-8494-02475973a28f
UUID의 문서도 읽을 가치가 있을 수 있습니다.
데이터 유형 UUID는 RFC 4122, ISO/IEC 9834-8:2005 및 관련 표준에 정의된 UUID(Universally Unique Identifier)를 저장합니다. (일부 시스템에서는 이 데이터 유형을 글로벌 고유 식별자 또는 GUID라고 부릅니다.)이 식별자는 128비트 양으로, 알려진 우주에서 동일한 식별자가 동일한 알고리즘을 사용하여 다른 사람에 의해 생성될 가능성을 매우 줄이기 위해 선택된 알고리즘에 의해 생성됩니다.따라서 분산 시스템의 경우 이러한 식별자는 단일 데이터베이스 내에서만 고유한 시퀀스 생성기보다 더 나은 고유성 보장을 제공합니다.
UUID와의 충돌은 얼마나 드물거나 추측할 수 있습니까?무작위라고 가정하면,
단일 중복("충돌")의 확률이 10억 분의 1이 되려면 약 100조 개의 버전 4 UUID가 생성되어야 합니다.261개의 UUID(2.3 x 10^18 또는 2.3 오십억)가 생성된 후에만 한 번의 충돌 가능성이 50%로 증가합니다.이러한 숫자를 데이터베이스와 연결하고 버전 4 UUID 충돌 가능성이 무시할 수 있는지 여부에 대한 문제를 고려하여 UUID 충돌이 하나 포함될 확률이 50%인 2.3조 버전 4 UUID가 포함된 파일을 고려해 보십시오.다른 데이터나 오버헤드가 없다고 가정할 경우 36엑사바이트의 크기가 되며, 이는 페타바이트 단위로 현재 존재하는 가장 큰 데이터베이스보다 수천 배 더 큽니다.초당 10억 개의 UUID가 생성되는 속도라면 파일에 대한 UUID를 생성하는 데 73년이 걸릴 것입니다.또한 백업이나 중복성이 없다고 가정할 경우 이를 저장하는 데 약 360만 개의 10테라바이트 하드 드라이브 또는 테이프 카트리지가 필요합니다.초당 1기가비트의 일반적인 "Disk-to-Buffer" 전송 속도로 파일을 읽는 것은 단일 프로세서에서 3000년 이상이 소요됩니다.복구할 수 없는 드라이브 읽기 오류율은 기껏해야 1018비트 읽기당 1비트이기 때문에 파일에 약 1020비트가 포함되지만 파일을 끝에서 끝까지 한 번만 읽기만 해도 중복된 UUID보다 약 100배 더 많이 잘못 읽힐 수 있습니다.스토리지, 네트워크, 전원 및 기타 하드웨어 및 소프트웨어 오류는 UUID 복제 문제보다 수천 배 더 자주 발생할 것입니다.
출처: 위키피디아
요약하자면,
- UUID가 표준화되었습니다.
gen_random_uuid()128비트(2**128 조합)에 저장된 128비트의 랜덤입니다.0-폐기물.random()PostgreSQL(2**52 조합)에서는 52비트의 랜덤만 생성합니다.md5()UUID로 저장된 값은 128비트이지만 입력만큼 랜덤할 수 있습니다(사용하는 경우 52비트).md5()텍스트로 저장되는 텍스트는 288비트이지만 입력만큼만 랜덤할 수 있습니다(사용하는 경우 52비트). UUID 크기의 두 배 이상이고 랜덤성의 일부입니다.)md5()해시로서, 효율적으로 많은 작업을 수행하지 못할 정도로 최적화될 수 있습니다.- UUID는 스토리지에 매우 효율적입니다.128비트의 을 제공합니다.SQL은 정확하게 128비트인 유형을 제공합니다.와는과 다르게 .
text그리고.varchar장저하등는으로 등.varlena문자열의 길이에 대한 오버헤드가 있습니다. - PostgreSQL nifty UUID는 일부 기본 연산자, 캐스팅 및 기능과 함께 제공됩니다.
Marcin의 솔루션을 기반으로 임의의 알파벳(이 경우 62자 모두 ASCII 영숫자)을 사용할 수 있습니다.
SELECT array_to_string(array
(
select substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', trunc(random() * 62)::integer + 1, 1)
FROM generate_series(1, 12)), '');
이해주요를 사용해 .string_agg!
SELECT string_agg (substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ceil (random() * 62)::integer, 1), '')
FROM generate_series(1, 45);
이를 MD5와 함께 사용하여 UUID도 생성하고 있습니다. 비트수보가많랜보다 가 많은 랜덤 .random ()정수의
나는 Postgre와 놀고 있었습니다.최근 SQL, 그리고 나는 내장된 Postgre만을 사용하여 조금 더 나은 솔루션을 찾은 것 같습니다.SQL 메서드 - pl/pgsql이 없습니다.유일한 제한은 현재 UPCASE 문자열, 숫자 또는 소문자 문자열만 생성한다는 것입니다.
template1=> SELECT array_to_string(ARRAY(SELECT chr((65 + round(random() * 25)) :: integer) FROM generate_series(1,12)), '');
array_to_string
-----------------
TFBEGODDVTDM
template1=> SELECT array_to_string(ARRAY(SELECT chr((48 + round(random() * 9)) :: integer) FROM generate_series(1,12)), '');
array_to_string
-----------------
868778103681
번째주의 두 입니다.generate_series합니다. . . . . . . . . . . . . . . . . . . . . ?
기본적으로 활성화되지 않은 상태에서 코어 확장 중 하나를 활성화할 수 있습니다.
CREATE EXTENSION IF NOT EXISTS pgcrypto;
그런 다음 명령문은 gen_salt()에 대한 단순 호출이 되어 임의 문자열을 생성합니다.
select gen_salt('md5') from generate_series(1,4);
gen_salt
-----------
$1$M.QRlF4U
$1$cv7bNJDM
$1$av34779p
$1$ZQkrCXHD
선행 번호는 해시 식별자입니다.고유한 식별자를 사용하여 여러 알고리즘을 사용할 수 있습니다.
- md5: $1$
- bf: $2a$06$
- des: 식별자 없음
- xdes: _J9..
확장에 대한 추가 정보:
- pgCrypto: http://www.postgresql.org/docs/9.2/static/pgcrypto.html
- 포함된 확장 기능: http://www.postgresql.org/docs/9.2/static/contrib.html
편집
Carrol에 v9.4으로 Evan Carrol을 할 수 .gen_random_uuid()
http://www.postgresql.org/docs/9.4/static/pgcrypto.html
@Kavius는 사용을 권장했지만, 대신에gen_salt요, ㅠㅠgen_random_bytes그리고 어때요?sha512대신에md5?
create extension if not exists pgcrypto;
select digest(gen_random_bytes(1024), 'sha512');
문서:
F.25.5. 무작위 데이터 함수
gen_between_bytes(카운트 정수)는 a로 반환합니다.
암호화된 강력한 임의 바이트 수를 반환합니다.한 번에 최대 1024바이트를 추출할 수 있습니다.이는 랜덤성 생성기 풀의 배출을 방지하기 위한 것입니다.
INTEGER 매개 변수는 문자열의 길이를 정의합니다.62개의 모든 영숫자를 동일한 확률로 포함하도록 보장됩니다(인터넷에 떠도는 다른 솔루션과 달리)
CREATE OR REPLACE FUNCTION random_string(INTEGER)
RETURNS TEXT AS
$BODY$
SELECT array_to_string(
ARRAY (
SELECT substring(
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
FROM (ceil(random()*62))::int FOR 1
)
FROM generate_series(1, $1)
),
''
)
$BODY$
LANGUAGE sql VOLATILE;
저는 당신이 임의의 문자열 그 자체를 찾고 있다고 생각하지 않습니다.세션 확인에 필요한 것은 고유한 문자열입니다.감사를 위해 세션 확인 정보를 저장합니까?이 경우 세션 간에 고유한 문자열이 필요합니다.저는 두 가지 간단한 접근법을 알고 있습니다.
- 시퀀스를 사용합니다.단일 데이터베이스에서 사용하기 좋습니다.
- UUID를 사용합니다.보편적으로 고유하며 분산 환경에도 적합합니다.
UUID는 생성 알고리즘을 통해 고유한 것으로 보장됩니다. 실제로 언제든지 모든 시스템에서 동일한 숫자 두 개를 생성할 가능성은 매우 낮습니다(UUID보다 주기성이 훨씬 작은 랜덤 문자열보다 훨씬 강합니다).
UUID를 사용하려면 uuid-osp 확장을 로드해야 합니다.설치가 완료되면 SELECT, INSERT 또는 UPDATE 호출에서 사용 가능한 uuid_generate_vXX() 함수를 호출합니다.UUID 유형은 16바이트 숫자이지만 문자열 표현도 있습니다.
create extension if not exists pgcrypto;
그리고나서
SELECT encode(gen_random_bytes(20),'base64')
아니 심지어는
SELECT encode(gen_random_bytes(20),'hex')
이는 20바이트 = 160비트의 랜덤성에 대한 것입니다(예: sha1 길이).
select * from md5(to_char(random(), '0.9999999999999999'));
select encode(decode(md5(random()::text), 'hex')||decode(md5(random()::text), 'hex'), 'base64')
언급URL : https://stackoverflow.com/questions/3970795/how-do-you-create-a-random-string-thats-suitable-for-a-session-id-in-postgresql
'programing' 카테고리의 다른 글
| Nodejs의 Mongodb vs Postgres (0) | 2023.05.29 |
|---|---|
| 선택한 쿼리의 출력을 하나의 어레이에 포스트그레스로 저장 (0) | 2023.05.29 |
| PostgreSQL에서 열 기본값을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.29 |
| Bash에서 문자열이 어떤 값으로 시작하는지 확인하려면 어떻게 해야 합니까? (0) | 2023.05.29 |
| ITunes 리뷰 URL 및 iOS 7(사용자에게 앱 평가 요청) AppStore에 빈 페이지 표시 (0) | 2023.05.29 |