2013-04-09 2 views
1

나는 한 달 동안 그리고 한 해 동안 고유 한 ID (최대한 고유 한 것)가 필요합니다. 코드는 짧아야합니다. 입력/기록 식별 번호로 회계 소프트웨어에 코드가 필요합니다.한 달 안에 고유 한 아이디

한 달 동안 회사가 10000 건을 넘지 않는 트랜잭션을 처리하는 것이 목표입니다. 또한 코드는 가능한 한 짧아야하며 가능한 한 PHP 코드가 가능한 한 짧고 서버 리소스를 거의 사용하지 않는 것이 목표입니다.

예를 들어 한 달에 10 000 건의 트랜잭션이 발생하는 경우 Mysql 자동 증가를 사용할 수 없으며 몇 년 후 그 수는 매우 길어집니다. 순간

date("m"). '-' .substr(md5(uniqid(rand(), true)), -20, 4); 

가 더 좋은 솔루션입니다 같은 사용하기로 결정?

+1

월 한 달 후에? 나는 그 자리에 일년도 붙일 것입니다. –

+2

"증분 숫자 ID"가 아닌 무작위 ID가 매월 초에 0으로 재설정되는 이유는 무엇입니까? 단지 4 개의 임의 문자 (0-9 a-f)로 "충돌"의 위험이 상대적으로 높습니다. –

+0

나는 아주 오래 될 것이기 때문에 해가 필요하지 않다고 생각한다. 회계사 또는 회계 책임자는 각 문서에이를 기록해야합니다. 그래서 이드는 가능한 한 짧아야합니다. 동일한 ID가 2013 년과 2014 년에 있으면 문제가 아닌 것으로 생각합니다. ID는 소프트웨어에서 항목을 찾는 데 필요합니다. 그러한 것이 우리의 법률 요건입니다. 누군가가 문서의 ID를보고 회계사에게 묻습니다. 소프트웨어에 기록 된 위치를 보여줍니다. – user2232696

답변

11

나는 당신이 속이고 있다는 것을 제출할 것입니다. 표준 mysql 자동 증가 (INT)는 4,294,967,296까지 올라갈 것입니다. 따라서 한 달에 10 만 건의 거래가 발생하면 35,791 년 동안 만 지속됩니다.

물론 충분하지 않은 경우 BIGINT를 사용할 수 있습니다.이 경우 BIGINT를 사용할 수 있으며,이 경우 153,722,867,280,912 년의 시간이 필요합니다. 그것은 우주의 예상 수명보다 꽤 길다.

이런 종류의 것은 자동 증가를위한 정확한 사용 사례입니다.

+0

+1, OMG Lolw't ... 나는 내가 35,791 년 전에 죽을 것이라고 확신합니다. –

+0

최고의 답변 :) 쿠키가 필요합니다. –

0
date("m").'-'.time().rand(0,9999) 

이 충분할 것으로 생각됩니다.

+0

no. 그렇지 않을 것이다. 생일 파라독스에 대해 읽어보십시오 : http://en.wikipedia.org/wiki/Birthday_problem –

+0

절대적으로 아닙니다 - 생일의 역설은이 점을 기대했던 것보다 적게 성공시킵니다. –

+0

당신은 시간() - 각 초마다 고유 한 10 자리 숫자와 0에서 9999까지의 난수가 있습니다. 초당 수백 건의 요청이있을 때만 중복이 발생합니다. –

-1

회사 ID (월간/년 및 md5와 함께 있음)를 사용하고 처음 10자를 사용하면 어떨까요? 이것은 항상 고유 할 것입니다.

+0

이고 자동 증가 이상의 이점은 없습니다. – Nanne

+0

반드시 그렇지는 않습니다. http://www.mscs.dal.ca/~selinger/md5collision/ –

+0

전체 달 동안 동일한 ID를 생성하지 않습니까? 질문은 한 달 안에 10,000 개의 고유 ID를 갖는 것에 대해 묻는 것이 었습니다. – MrGlass

1

그냥 uniqid()을 사용하십시오. 매월 또는 매년 고유하지 않은 세계적으로 고유 한 가치를 창출하도록 설계되었습니다.

+0

유한 값 집합을 출력하는 함수는 FYI만의 유일성을 보장 할 수 없습니다. 사실, 귀하의 주장과 직접적으로 모순되는 원칙이 있습니다 : http://en.wikipedia.org/wiki/Pigeonhole_principle –

+0

a) 그들은 이미 'uniqid'를 사용하고 있습니다. b) 100 % 고유하다고 주장 할 경우 해당 주장을 충족시키지 않으므로 증거를 제출하십시오. – Jon

+0

당신이 옳습니다, 사과드립니다. 100 %는 사실이 아닙니다. -이 유스 케이스 (<10,000/월)가 될 수도 있습니다. – MrGlass

3

50년 후 귀하의 ID는 50x12x10.000 = 6.000.000 될 것입니다. mysql에 대한 매우 작은 ID입니다. 당신은 사용자에게 그렇게 오래 ID를 표시하지 않으려면

당신은 dechex

$userFriendlyId = dechex($id); 

을하고 hexdec

die(dechex(6000000)); //will output 5b8d80 

또는 다른 converting, 감사와 사용자 친화적 인 ID에서 쿼리를 만들 수 있습니다 존에게.

+0

또는 다른 형식의 기본 변환으로 더 많은 글자를 얻을 수 있지만 decache with will. –

+0

물론, 예를 들어. – Narek

0

나는 몇 자리 해시

$random_hash = substr(md5(uniqid(rand(), true)), 10, 10); 
echo date('m-Y-').$random_hash ; 

를 제안하지만 난하지 않습니다. 출력에 고유 한 기본 키와 날짜 ('m-Y')를 조합하면 회계상의 이유로 더 유용 할 수 있습니다.

3

우선 자동 증가도 사용합니다. 언급 한 코드 (월 + 임의의 물건)를 사용하기로하더라도, 숫자 (int/bigint) 자동 증가 ID를 사용하는 것이 좋습니다. 코드와 데이터베이스 (참조 레코드/조회 레코드)가 통신하려면이 ID를 '표면 아래'로 사용해야합니다.

'month + random stuff'식별자의 경우 동일한 마이크로 초에서 두 트랜잭션이 발생하는 경우 microseconds를 기반으로하고 고유하지 않으므로 uniqid()과 함께 사용할 것을 권장하지 않습니다. 또한이 함수는 해시에 매우 유용하기 때문에 md5()의 사용을 권장하지 않지만 문자 생성에만 사용하면 코드가 많이 느려집니다.

또한 자신의 코드 제안은 16 가지 가능성을 제공하는 0-9 또는 a-f (16 진수) 일 수있는 4 개의 임의 문자를 생성합니다. 16 개의 가능성을 가진 4 개의 문자는 16x16x16x16 = 65,536 개의 고유 한 문자열을 제공합니다. 10,000 개의 문자열을 렌더링 할 때 중복이 발생할 가능성이 매우 높습니다.

char 0-9, a-z 및 A-Z에서 무작위 문자열을 생성하는 것이 좋을 것입니다. char 및 char에 대해 36 가지의 가능성을 제공하며 36x36x36x36 = 1,679,616 고유 문자열을 제공합니다. 더 많은 문자는 중복 (충돌) 가능성을 줄입니다. 이 같은 같은 일을 할 수있는 :

function randString($length = 4) { 
    $randChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    $randString = ''; 
    while (strlen($randString) < abs(intval($length))) { 
     $randString .= substr($randChars, rand(0, strlen($randChars)-1), 1); 
    } 
    return $randString; 
} 

$id = date('m') . randString(4); 

이 당신에게 한 문자를 저장하기 때문에 나는 또한 대시 ('-') 사이의 달 임의의 문자를 떠날 것이다 당신은 처음 두 문자가 항상 알고 달의 수.

편집 : 할 몇 가지 테스트 내가 충돌에 대한 몇 가지 테스트를 수행 한

: 나는 10,000 무작위 문자열을 백 번 렌더링과 고유성 때마다 확인했습니다. (5), (당신처럼) 길이가 3, 4와이를 완료하고 6 그래서 여기 결과입니다 :

-------- Length 3 ------------ 
Minimal duplicates: 170 
Maximum duplicates: 241 
Average duplicates: 207.05 
-------- Length 4 ------------ 
Minimal duplicates: 0 
Maximum duplicates: 8 
Average duplicates: 3.19 
-------- Length 5 ------------ 
Minimal duplicates: 0 
Maximum duplicates: 2 
Average duplicates: 0.05 
-------- Length 6 ------------ 
Minimal duplicates: 0 
Maximum duplicates: 0 
Average duplicates: 0 

절대 0 %도 참조 Mark B 지적과 같은 충돌의 가능성은 배제 할 수 없다 생일 문제에.

관련 문제