2017-10-04 1 views
3

나는 루비에서는 PHP 만 사용하지 못했습니다. 도움이 필요해.Ruby Digest :: MD5.base64digest와 PHP base64_encode의 결과가 다른 것

나는 그런 어떤 인코딩 문자열 루비 코드를 가지고 :

str = '123'; 
arr = str.bytes 
p Digest::MD5.base64digest(arr.pack('C*')) # ICy5YqxZB1uWSwcVLSNLcA== 

내가 PHP에서 동일한 작업을 수행하고, 같은 결과를 얻을 필요가있다. 내 예

$str = '123'; 
$bytes = unpack('C*', $str); 
$pack = pack('C*', implode(', ', $bytes)); 
echo base64_encode(md5($pack)); // YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI= 

왜 결과가 다른가요? 도와 주셔서 감사합니다.

+0

내 대답을 보았습니까? 잘하면 도움이됩니다. –

+0

그래, 도움이된다! 감사. – alexandernoa

답변

1

바이트를 언 패킹하고 다시 패킹 할 때 필요하지 않지만 코드를 그대로 유지하십시오.

PHP에서 pack은 각 배열 인수가 전달되어야하므로 각 인수를 루프에 다시 채워야합니다.

<?php 
$str = 123; 
$bytes = unpack('C*', $str); 
$pack = null; 
foreach ($bytes as $arg) $pack .= pack('C*', $arg); 

또는 PHP> 5.6에서 인라인 인수 압축 풀기를 사용할 수 있습니다. rubys base64digest가 소화 상태를 유지하기 때문에 ...

$str = 123; 
$bytes = unpack('C*', $str); 
$pack = pack('C*', ...$bytes); 

그런 다음 마지막 문제는 또한 동일한 기능을 수행 할 MD5의 두 번째 PARAM raw_output을 사용할 필요가있다.

옵션적인 raw_output TRUE로 설정하면, 다음의 MD5 다이제스트는 대신 그래서 완성 된 이식 코드의 모습 (16)

$str = 123; 
echo base64_encode(md5($str, true)); 

의 길이가 원시 바이너리 형식으로 반환된다 :

$str = 123; 
$bytes = unpack('C*', $str); 
$pack = pack('C*', ...$bytes); 
echo base64_encode(md5($pack, true)); // ICy5YqxZB1uWSwcVLSNLcA== 

아니면 그냥.

<?php 
$str = 123; 
echo base64_encode(md5($str, true)); // ICy5YqxZB1uWSwcVLSNLcA== 
+0

늦게 답변 해 주셔서 죄송합니다. 귀하의 코드를 시험해 보니 매우 잘 작동합니다! 정말 고마워!!! – alexandernoa

+0

np, 기꺼이 도와주세요. –

관련 문제