우선 자동 증가도 사용합니다. 언급 한 코드 (월 + 임의의 물건)를 사용하기로하더라도, 숫자 (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 지적과 같은 충돌의 가능성은 배제 할 수 없다 생일 문제에.
월 한 달 후에? 나는 그 자리에 일년도 붙일 것입니다. –
"증분 숫자 ID"가 아닌 무작위 ID가 매월 초에 0으로 재설정되는 이유는 무엇입니까? 단지 4 개의 임의 문자 (0-9 a-f)로 "충돌"의 위험이 상대적으로 높습니다. –
나는 아주 오래 될 것이기 때문에 해가 필요하지 않다고 생각한다. 회계사 또는 회계 책임자는 각 문서에이를 기록해야합니다. 그래서 이드는 가능한 한 짧아야합니다. 동일한 ID가 2013 년과 2014 년에 있으면 문제가 아닌 것으로 생각합니다. ID는 소프트웨어에서 항목을 찾는 데 필요합니다. 그러한 것이 우리의 법률 요건입니다. 누군가가 문서의 ID를보고 회계사에게 묻습니다. 소프트웨어에 기록 된 위치를 보여줍니다. – user2232696