문제
내 사용자 데이터베이스 테이블에서 사용자 이메일 주소의 MD5 해시를 ID로 사용합니다.
예: email(example@example.org) = id(d41d8cd98f00b204e9800998ecf8427e)
안타깝게도 이제 ID가 정수만 될 수 있는 API를 사용할 수 있으려면 ID를 정수 값으로 표시해야 합니다.
이제 수신 시 다시 디코드를 보내기 위해 ID를 정수로 인코딩하는 방법을 찾고 있습니다.어떻게 해야 합니까?
지금까지 내 아이디어:
convert_uuencode()
그리고convert_uudecode()
MD5 해시의 경우- MD5 해시의 모든 문자를 해당 문자로 바꿉니다.
ord()
값
어떤 접근 방식이 더 낫습니까?이를 수행하는 더 좋은 방법을 알고 있습니까?
당신이 나를 도울 수 있기를 바랍니다.미리 감사드립니다!
해결책
조심하세요.MD5를 정수로 변환하려면 큰(128비트) 정수에 대한 지원이 필요합니다.사용 중인 API는 32비트 정수만 지원하거나 더 나쁜 경우 부동 소수점 숫자를 처리할 수도 있습니다.어느 쪽이든, 귀하의 신분증은 삭제될 것입니다.이 경우 MD5를 정수로 변환하는 것보다 두 번째 ID를 임의로 할당하는 것이 훨씬 더 나은 처리 방법입니다.
그러나 만약 당신이 확신하는 API가 임의의 큰 정수를 문제 없이 처리할 수 있으므로 MD5를 16진수에서 정수로 변환하면 됩니다.그러나 PHP는 이 내장 기능을 지원하지 않을 가능성이 높습니다. 왜냐하면 PHP는 이를 32비트 정수 또는 부동 소수점으로 표현하려고 시도하기 때문입니다.아마도 다음을 사용해야 할 것입니다. PHP GMP 라이브러리 그것을 위해.
다른 팁
다른 방법으로 다른 방식으로 행한 좋은 이유가 있습니다.
그러나 당신이하고 싶은 것이 MD5 해시를 소수점 숫자 문자열 (MD5는 이미 문자열 형태의 정수이기 때문에 "정수에 의해 표현된다"는 사실을 알 수 있습니다), 동일한 MD5 문자열로 다시 변환합니다.
function md5_hex_to_dec($hex_str)
{
$arr = str_split($hex_str, 4);
foreach ($arr as $grp) {
$dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT);
}
return implode('', $dec);
}
function md5_dec_to_hex($dec_str)
{
$arr = str_split($dec_str, 5);
foreach ($arr as $grp) {
$hex[] = str_pad(dechex($grp), 4, '0', STR_PAD_LEFT);
}
return implode('', $hex);
}
데모:
$md5 = md5('example@example.com');
echo $md5 . '<br />'; // 23463b99b62a72f26ed677cc556c44e8
$dec = md5_hex_to_dec($md5);
echo $dec . '<br />'; // 0903015257466342942628374306682186817640
$hex = md5_dec_to_hex($dec);
echo $hex; // 23463b99b62a72f26ed677cc556c44e8
물론, 스트링을 사용하여 스트링 유형으로 만 사용하는 것과 같은 문자열을 사용하여 스트링 유형으로 만 사용하는 것과 같은 문자열을 사용해야합니다.
32 비트 응축의 경우 MD5 HASH의 4 개의 16 진 쌍 (8 자)을 선택하여 간단한 솔루션을 만들 수 있습니다. 여기서 각 쌍은 하나의 바이트를 나타냅니다. intval()
.
서명되지 않은 32 비트 int의 경우 :
$inthash = intval(substr(md5($str), 0, 8), 16);
서명 된 32 비트 int의 양수 값에 대해서만 :
$inthash = intval(substr(md5($str), 0, 8), 16) >> 1;
이것은 문서에서 언급 한 대부분의 최신 시스템에 대해 최대 64 비트 (8 바이트 또는 16 자)의 값에만 효과가있을 것입니다.
64 비트 INT를 수용 할 수있는 시스템에서는 2 개의 INT로 전체 128 비트 MD5 해시를 소비하는 분할 전략이 다음과 같습니다.
$hash = md5($str);
$inthash1 = intval(substr($hash, 0, 16), 16);
$inthash2 = intval(substr($hash, 16, 16), 16);
당신은 사용할 수 있습니다 Hexdec 16 진수 문자열을 구문 분석하고 데이터베이스에 번호를 저장합니다.
자동 증가 된 int 필드 인 다른 필드를 추가 할 수 없습니까?
왜 ord ()? MD5는 더 나은 가독성을 위해 16 진수로 제공되는 일반 16 바이트 값을 생성합니다. 따라서 16 바이트 값을 손실없이 4 또는 8 바이트 정수로 변환 할 수 없습니다. 이것을 ID로 사용하려면 알고리즘의 일부를 변경해야합니다.
는 어때:
$ float = hexdec (md5 ( 'string'));
또는
$ int = (Integer) (substr (hexdec (md5 ( 'string')), 0,9)*1000000000);
충돌 가능성이 높지만 여전히 DB에서 해시 대신 사용하기에 여전히 좋은가요?
건배,
/Marcin
전자 메일 주소를 공유 폴더의 빈 임시 파일의 파일 이름으로 사용하십시오.
그런 다음 파일 이름으로 ftok에 전화하십시오. FTOK는 고유 한 정수 ID를 반환합니다.
그래도 독특하지는 않지만 API에 충분할 것입니다.