[英]PHP MD5 equivalent to Java
我需要一个与Java的MD5功能等效的PHP,该功能需要一个字节数组并将哈希作为16字节数组返回。 我不需要Java等效的PHP的md5函数。 问题在于PHP的md5
函数仅采用字符串,而不采用字节数组。
这是Java中的预期结果:
// input byte array
// for short: 123456
final byte[] data = new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56 };
// expected 16 hash bytes
// for short: ae1fa6209a246b8b2f2cd2d21be8f2e1
final byte[] expectedHash = new byte[] {
(byte) 0xae, (byte) 0x1f, (byte) 0xa6, (byte) 0x20,
(byte) 0x9a, (byte) 0x24, (byte) 0x6b, (byte) 0x8b,
(byte) 0x2f, (byte) 0x2c, (byte) 0xd2, (byte) 0xd2,
(byte) 0x1b, (byte) 0xe8, (byte) 0xf2, (byte) 0xe1 };
我在PHP中的尝试是:
<?php
// input byte array
$data = array(0x12, 0x34, 0x56);
// pack data in a string, becouse md5 can only
// compute a hash for a string
$dataString = pack('C*', $data); // is it the right way?
var_dump($dataString);
// compute the hash and get a string back
$hash = md5($dataString, true);
// expected 16 hash bytes
// for short: ae1fa6209a246b8b2f2cd2d21be8f2e1
$expected = array(
0xae, 0x1f, 0xa6, 0x20,
0x9a, 0x24, 0x6b, 0x8b,
0x2f, 0x2c, 0xd2, 0xd2,
0x1b, 0xe8, 0xf2, 0xe1);
var_dump($expected);
// convert the string back to a byte array
$actual = unpack('C*', $hash); // is it the right way?
var_dump($actual);
assert($expected == $actual);
?>
$dataString
的长度为0。因此第一个错误必须在pack
。 但是我不知道如何将任意字节数组打包到字符串中。 您能给我正确的format
参数吗?
我懂了 :)
<?php
function javaMd5($data) {
assert(is_array($data));
$dataString = byteArrayToString($data);
$hashString = md5($dataString, true);
assert(strlen($hashString) == 16);
$hash = stringToByteArray($hashString);
assert(count($hash) == 16);
return $hash;
}
function stringToByteArray($s) {
assert(is_string($s));
$result = array_fill(0, strlen($s), 0);
for ($i = 0; $i < strlen($s); $i++) {
$result[$i] = ord($s[$i]);
}
return $result;
}
function byteArrayToString($b) {
assert(is_array($b));
$asciiString = '';
for ($i = 0; $i < count($b); $i++) {
assert($b[$i] >= 0 && $b[$i] <= 255);
$asciiString .= chr($b[$i]);
}
$utf8String = utf8_encode($asciiString);
return $utf8String;
}
$data = array(0x12, 0x34, 0x56);
$expected = array(
0xae, 0x1f, 0xa6, 0x20,
0x9a, 0x24, 0x6b, 0x8b,
0x2f, 0x2c, 0xd2, 0xd2,
0x1b, 0xe8, 0xf2, 0xe1);
$actual = javaMd5($data);
assert($expected == $actual);
?>
我不确定字符串编码,但可以。 对于PHP使用隐式xyz编码的字符串而不是像Java这样的显式字节数组,我没有什么可理解的。 曼努埃尔没有说过关于char编码的一切。 多数民众赞成在可能的原因在于,如何使用XYZ语言计算与PHP等效的字符串的md5的问题太多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.