문제

저는 잡지 스크래치 오프 카드, 병과 상금 등에 사용되는 수백만 개의 영숫자 코드를 생성 해야하는 고객과 함께 일하고 있습니다. 그들은 캡에 인쇄하기에 충분히 짧아야하고, 1과 i, 0 및 o 등과 같은 모호한 문자가 포함되어 있지 않으며, 향후 사용을 위해 명시 적으로 저장되어야합니다. 우리는 할 수 있습니다. ' t 누군가가 구속하려고 할 때 '타당성'을 결정하는 알고리즘이 있습니다. 마지막으로, 그들은 코드가 대형 "코드 공간"내부에 무작위로 배포되도록하여 사람들이 알파벳을 걸어서 추가 코드를 추측 할 수 없도록하려고합니다.

이러한 종류의 코드 세트를 생성하기위한 합리적으로 효율적인 알고리즘에 대한 포인터가 있습니까? 나는 봉투 뒷면에 몇 가지를 긁었지만이 문제는 부적절한 냄새가 나는 냄새가납니다.

도움이 되었습니까?

해결책

약 1 천만 개의 고유 키 (예 :)가 필요한 경우 가장 좋은 방법은 기하 급수적으로 더 큰 키 공간을 선택하고 무작위로 생성하는 것입니다. 에 대해 읽으십시오 생일 역설 - 그것은 당신이 걱정해야 할 중요한 것입니다. 2^n 고유하고 안전한 키를 원한다면 최소 2^(2 * n) 가능한 값이 있는지 확인하십시오. 거친 O (n log n) 알고리즘은 다음과 같습니다.

  • 최소 2^50의 주요 공간을 사용하면 (즉, 2^50 가능한 고유 값을 허용 할 수 있습니다) 전체 데이터 세트에서 거의 충돌이 없을 것입니다. 그들이 2^25를 시도하면 열쇠를 얻을 확률.
  • 필요한만큼 난수를 생성하십시오
  • 키에서 데이터베이스를 색인화합니다 (이것은 O (n lg n) 단계 : 정렬)
  • DB를 통해 페이지와 전체 데이터 세트를 반복하여 복제물을 다듬습니다 (아래의 의사 코드)
  • 중복 행을 삭제하면 완료됩니다.

의사 코드 :

$last = null;
while ($current = getnext()) {
    if ($last == $current) {
        push($toDelete, $current);
    }
    $last = $current;
}

다른 팁

모호하지 않은 상단, 하위 및 숫자의 40 개의 기호 세트를 사용할 수 있다고 가정 해 봅시다.

N chars 시퀀스의 경우 40 개가 있습니다.N 조합

  • 404 = 2,560,000
  • 405 = 102,400,000
  • 406 = 4,096,000,000
  • 407 = 163,840,000,000
  • 408 = 6,553,600,000,000

따라서 8 Chars는 일하기에 꽤 좋은 공간을 제공합니다. 1 천만 개의 코드를 생성하면 코드를 무차별하기 위해 수십만 개의 조합을 시도해야합니다.

아니면 다른 방향에서 온다 - 가능한 코드, 코드 수 ~해야 한다 당신은 그들이 부르는 함정을 피하기 위해 생성합니다 생일 역설?

8 숯 코드를 복용하면 6,553,600,000,000은 약 2입니다.42, 따라서 합리적으로 2를 생성 할 수 있습니다21 그것의 코드 또는 2,097,152

한 번의 암호 알고리즘을 사용 하시겠습니까?

RFC4225 HMAC 알고리즘을 기반으로 한 세부 정보.

http://www.ietf.org/rfc/rfc4226.txt

그러나 0-9 자릿수 Base10 인코딩을 사용하는 대신 Base32를 사용하십시오.

당신이 사용하는 방법, 나는 당신이 숫자를 잘못 입력하거나 발명하려는 사람들에 대한 "1 차"방어로 체크 숫자를 추가하는 것이 좋습니다.

이상하게도 다음 씨앗으로 32 개의 독특한 줄을 생성 할 수있었습니다.

ABCDEFGHJKLMNPQRSTUVWXYZ23456789

더 긴 씨앗을 사용하면 40,000 개의 고유 한 줄을 성공적으로 생성 할 수있었습니다.

ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top