문제

내 사용자 데이터베이스 테이블에서 사용자 이메일 주소의 MD5 해시를 ID로 사용합니다.

예: email(example@example.org) = id(d41d8cd98f00b204e9800998ecf8427e)

안타깝게도 이제 ID가 정수만 될 수 있는 API를 사용할 수 있으려면 ID를 정수 값으로 표시해야 합니다.

이제 수신 시 다시 디코드를 보내기 위해 ID를 정수로 인코딩하는 방법을 찾고 있습니다.어떻게 해야 합니까?

지금까지 내 아이디어:

  1. convert_uuencode() 그리고 convert_uudecode() MD5 해시의 경우
  2. 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에 충분할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top