2014-02-17 4 views
3

다음과 같이 16 자리 16 진수 serial number를 생성하고 싶습니다 : F204-8BE2-17A2-CFF3. 일련 번호 생성 알고리즘이 필요합니다.

나는 당신이 모든 무작위로 이러한 시리얼 번호를 생성하기 위해 나에게 알고리즘을 제안 할 필요는

을 (이 패턴은 나에게 16^16 별개의 일련 번호를 제공하지만 그들 모두 필요하지 않습니다) 특별한 특징이다 : 각각 두 개의 시리얼 번호 (AT-이상)이 6 개 개의 숫자

(당신은, 그들은 여전히 ​​6 인덱스의 차이가 있어야이 가장 유사한 일련 번호를 부여하는 경우 = 그것은 의미)

이 특성을 가진 좋은 알고리즘은 이전에 생성 된 일련 번호를 기억해야하므로 그다지 원하지 않습니다. 선택된 쌍 (0.001 충분한 것 같습니다) 충돌하는

는 사실, 나는이 이상과 확률을하는 알고리즘을 필요 PS

: 난 그냥 10K를 만들려고했습니다
MD5 해시를 사용하여 무작위로 문자열을 만들고 비슷한 문자열 (비슷한 = 3 자 이상)을 0.00018 확률로주었습니다.

+0

"일련 번호가 잘못 될 가능성이 가장 적습니다 (0.001 미만이면 충분합니다"). 필요한 일련 번호의 수에 따라 다릅니다.16^16 + 1이 필요하면 적어도 하나의 완전한 충돌이 있어야합니다. –

+0

나는 16^16보다 너무 적은 최대 1M 일련 번호가 필요합니다. – Emadpres

+0

'0.001' 확률이란 무엇입니까? 충돌 할 선택 쌍에 대한 확률 또는 충돌 할 확률 * 충돌 쌍이 있습니까? –

답변

4

이전에 생성 된 코드를 모두 기억할 필요없이 올바른 생성기를 구성 할 수 있습니다. Hamming code을 사용하여 6 자 간격으로 일련 번호를 생성 할 수 있습니다. 해밍 코드는 임의로 생성 된 두 개의 값을 구분할 수 있도록 설계 할 수 있습니다. 거리가 멀수록 중복성이 높아 지므로 코드가 복잡해지고 숫자가 길어집니다.

먼저 원하는 해밍 코드를 디자인합니다.이 코드는 숫자를 16 진수 시퀀스로 인코딩 한 다음 임의의 숫자 시퀀스를 가져 와서 소수 (예 : 소수)로 사용할 수 있습니다. 당신은 단지 언제나 어떤 번호가 마지막에 사용되었고 다음 번호를 사용했는지 기억할 필요가 있습니다.

두 직렬의 최소 거리를 적절히 보장 할 필요가없고 작은 오류로 해결할 필요가 없다면 절반 정도의 해시 함수 또는 사이퍼가 적절하게 간격을 둔 출력을 생성해야한다고 말합니다. 그러므로 내가 시도하려고하는 첫 번째 일은 MD5 또는 SHA 해시를 사용하고 1 - 1000의 숫자로 시운전하는 것입니다. 제 희망은 결과가 아주 만족 스럽다는 것입니다.

0

ANSI X9.17 의사 랜덤 비트 생성기를 살펴 보시기 바랍니다. 알고리즘 스케치는 slides에 나와 있습니다. ANSI X9.17은 원하는대로 64 비트 의사 랜덤 문자열을 생성합니다.

이 발전기의 개정 된 버전은 NIST의 승인을 받았습니다. 이 page을보십시오.

이제 ANSI X9.17 제너레이터를 사용하든, 다른 발전기를 사용하든, 직접 생성하는지 여부에 관계없이 생성기가 의사 랜덤 비트의 품질을 보장하기 위해 일부 통계 테스트를 통과하는 것이 좋습니다.

예시 테스트는 ENT battery, DIEHARD batteryNIST battery을 포함합니다.

+0

좋습니다. 나는 이것을 시험 할 것이다. – Emadpres