2009-06-01 4 views
2

makeKey() 및 keyExists()의 두 가지 기능이 있습니다.고유 한 키 만들기 - 가장 효율적인 방법

makeKey()는 단순히 5 자리의 임의의 영숫자 키를 생성하며 keyExists()는이 키를 유일한 인수로 받아 테이블에 있는지 여부에 따라 true/false를 반환합니다.

나는 아주 간단한 것을 할 필요가 있지만, 나는 그것을하는 가장 빠른 방법을 이해할 수 없다.

고유 한 키가 반환 될 때까지 키를 만들고 테이블에 키가 있으면 키를 다시 입력하면됩니다. 나는 while 루프가 충분할 것이라고 생각한다.

오히려 기본적인 질문을 용서해주십시오. 제 생각 엔 어제 태양을 두들겨 먹었습니다.

+0

99999 행이 지나면 시간이 오래 걸릴 것입니다. –

답변

5

가 나는 do 사용하십시오 - while 루프 :

do { 
    $newKey = makeKey(); 
} while (keyExists($newKey)); 

이 모든에 새 키를 생성하는 것 열쇠가 아직 존재하지 않을 때까지 반복.

2

내 PHP는 약간 녹슨, 그래서이 의사 코드 고려 :

$key_exists = true; 
while($key_exists) { 
     $key = generateKey(); 
     $key_exists = checkKey($myKeysHash, $key); 
} 
// $key is now unique and ready to use 
0

테이블을 언급 했으므로이 키를 데이터베이스에 저장하고 있는지 궁금합니다. 그렇다면 접근법이 경쟁 조건을 갖게 될 것입니다. 다른 프로세스가 해당 키를 사용하기 전에 바로 사용할 수있는 키인지 확인하십시오.

더 나은 방법은 가능한 키를 생성 한 다음 키 테이블에 INSERT를 수행하고 성공할 때까지 다른 키를 사용하여 다시 시도하는 것입니다.

5

작성에 의존하는 모든 솔루션은 핵심 공간이 가득 차면 성능이 크게 떨어집니다. 자동 생성 된 열 (ID 또는 GUID)을 사용하여 고유 키를 생성하는 것이 좋습니다. 영숫자가 필요한 경우 매핑 기능을 사용하여 비트 그룹을 선택하고 알파벳으로 색인으로 사용하여 원하는 알파벳으로 변환합니다. 의사 코드는 5 자리 숫자에 고정하지 않는 경우

alphabet = "ABCDE...789"; 
key = insert new row, get autogenerated key 
alphaKey = ""; 
while (get n bits from key) 
    alphaKey += alphabet[bits] 
done 
echo alphaKey 
0

, 당신은 당신의 ID의 해시 + 이름 열을 사용하는 방법에 대해 생각할 수있는

.

1

uniqid()과 같은 내장 PHP 함수를 사용하지 않으시겠습니까?

0

또한 데이터베이스를 사용하고 있다고 가정합니다.

데이터베이스에서 고유 한 자동 증가 ID 열을 사용할 수 없습니까? 데이터베이스 엔진이 동일한 ID를 두 번 할당하지 않기 때문에 키가 존재하는지 확인하는 요구 사항이 제거됩니다.

그러나 새 기능을 코딩하는 것보다는 응용 프로그램의 논리를 변경해야합니다.

0

랜덤해야합니까? 변수를 증가시키고 다음 필드를 다른 필드에 사용하기 위해 저장하십시오.

0

while (keyExists($newKey = makeKey()));

키가이 새로운 하나를 생성합니다 존재하는 경우, 검사를하는 아마 가장 빠른 방법. 새 고유 키를 가져 오기 전에 여러 번 데이터베이스를 확인해야 할 충돌이 많이 발생하기 시작하면 makeKey() 알고리즘을 다시 생각해 보는 것이 좋습니다. DB 호출은 비용이 많이 들지만 호출이 적을수록 스크립트를 더 빠르고 효율적으로 만들 수 있습니다.

관련 문제