학생들을위한 독특한 교실을 만들기 위해 짧은 5 자 해시를 만들고 있습니다. 일반적인 해시는 AJ678
.
다음과 같이 해시를 생성하고 있습니다.
public function generateToken($length = 5)
{
return strtoupper(substr(md5(rand()), 0, $length));
}
앱이 사용되는 동안 수천 개의 강의실이 생성 될 것으로 예상하고 있습니다. 결국 충돌이 발생할 것입니다. 모든 해시가 고유한지 확인하는 방법을 알고 싶습니다.
token
필드를 고유 한 필드로 만들었습니다 .
이 작업을 수행하는 가장 좋은 방법은 해시를 생성 한 다음 해시가 내 데이터베이스에 이미 있는지 확인하고 새 해시를 생성하면 해시를 사용하는 것입니다.
이것이 올바른 방법입니까?
편집 : 나는 자신을 호출하는 함수를 구현하는 것에 대해 약간 안전하지 않습니다 ...이게 맞습니까?
public function generateToken($length = 5)
{
$token = strtoupper(substr(md5(rand()), 0, $length));
if ($this->tokenExistsAlready($token)) {
$this->generateToken();
} else {
return $token;
}
}
public function tokenExistsAlready()
{
$this->db->where('token', $token);
$query = $this->db->get('classes');
if ($query->num_rows() > 0) {
return true;
} else {
return false;
}
}
먼저 "고유"를 정의하십시오. 우리 용어로 고유 한 것은 데이터베이스에 아직 존재하지 않는 길이의 문자열입니다.
이것은 당신의 질문에 거의 대답합니다. 데이터베이스에 대해 확인하지 않는 한 문자열이 고유하다는 것을 확신 할 수 없습니다. 끈이 길수록 기회가 더 얇아집니다. 따라서 귀하의 경우 while
데이터베이스를 확인 하는 루프를 만들었을 것 입니다. 데이터베이스에 저장 한 두 번째 문자열부터 시작하여 무작위로 생성 된 두 개의 문자열을 연속으로 맞출 수 있습니다 (그리고 나중에 타임 라인을 따라갈 것입니다). 따라서 "고유 한"항목을 찾을 때까지 루프의 고유성을 확인하는 것이 좋습니다. 다음과 같은 추상적 인 것 :
$token = generateToken();
while(tokenExists($token))
{
$token = generateToken();
}
문자열의 진정한 고유성을 보장 하는 것은 없습니다 . 임의의 문자열을 생성하는 MySQL UUID()
또는 UUID_SHORT()
, PHP uniqid()
또는 기타를 사용할 수 있습니다 . 그러나 기존 데이터베이스와 비교하지 않는 한 여전히 고유성을 보장하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다