/** * Calculate the Hamming Distance. * * @param int $hash1 * @param int $hash2 */ public function distance($hash1, $hash2) { if (extension_loaded('gmp')) { $dh = gmp_hamdist("0x{$hash1}", "0x{$hash2}"); } else { $hash1 = hexdec($hash1); $hash2 = hexdec($hash2); $dh = 0; for ($i = 0; $i < 64; $i++) { $k = 1 << $i; if (($hash1 & $k) !== ($hash2 & $k)) { $dh++; } } } return $dh; }
/** * Calculate the Hamming Distance. * * @param int $hash1 * @param int $hash2 */ public function distance($hash1, $hash2) { if (!is_numeric($hash1) or !is_numeric($hash2)) { throw new UnexpectedValueException(); } if (extension_loaded('gmp')) { $dh = gmp_hamdist(sprintf("0x%x", $hash1), sprintf("0x%x", $hash2)); } else { $dh = 0; for ($i = 0; $i < 64; $i++) { $k = 1 << $i; if (($hash1 & $k) !== ($hash2 & $k)) { $dh++; } } } return $dh; }
<?php var_dump(gmp_hamdist(1231231, 0)); var_dump(gmp_hamdist(1231231, -1)); var_dump(gmp_hamdist(1231231, "8765434567897654333334567")); var_dump(gmp_hamdist(-364264234, "8333765434567897654333334567")); $n = gmp_init("8765434567"); $n1 = gmp_init("987654445678"); var_dump(gmp_hamdist($n, "8333765434567897654333334567")); var_dump(gmp_hamdist($n, $n)); var_dump(gmp_hamdist($n, $n1)); var_dump(gmp_hamdist($n, $n1, 1)); var_dump(gmp_hamdist($n, array())); var_dump(gmp_hamdist(array(), $n)); var_dump(gmp_hamdist(array(), array())); var_dump(gmp_hamdist()); echo "Done\n";
$b = gmp_init(21); $g = gmp_gcd($a, $b); $r = gmp_gcdext($a, $b); $check_gcd = gmp_strval($g) == gmp_strval($r['g']); $eq_res = gmp_add(gmp_mul($a, $r['s']), gmp_mul($b, $r['t'])); $check_res = gmp_strval($g) == gmp_strval($eq_res); if ($check_gcd && $check_res) { $fmt = "Solution: %d*%d + %d*%d = %d\n"; printf($fmt, gmp_strval($a), gmp_strval($r['s']), gmp_strval($b), gmp_strval($r['t']), gmp_strval($r['g'])); } else { echo "Error while solving the equation\n"; } // gmp_hamdist $ham1 = gmp_init("1001010011", 2); $ham2 = gmp_init("1011111100", 2); echo gmp_hamdist($ham1, $ham2) . "\n"; echo gmp_popcount(gmp_xor($ham1, $ham2)) . "\n"; // gmp_init (although that's probably tested well by now) var_dump($a = gmp_init(123456)); var_dump($b = gmp_init("0xFFFFDEBACDFEDF7200")); // gmp_intval echo gmp_intval(PHP_INT_MAX) . "\n"; echo gmp_intval(gmp_add(PHP_INT_MAX, 1)) . "\n"; echo gmp_intval(gmp_sub(PHP_INT_MAX, 1)) + 1 . "\n"; echo gmp_strval(gmp_add(PHP_INT_MAX, 1)) . "\n"; // gmp_invert echo gmp_invert("5", "10"); // no inverse, outputs nothing, result is FALSE $invert = gmp_invert("5", "11"); echo gmp_strval($invert) . "\n"; // gmp_jacobi
/** * Calculate the Hamming Distance. * * @param int $hash1 * @param int $hash2 * @return int */ public function distance($hash1, $hash2) { if (extension_loaded('gmp')) { if ($this->mode === self::HEXADECIMAL) { $dh = gmp_hamdist('0x' . $hash1, '0x' . $hash2); } else { $dh = gmp_hamdist($hash1, $hash2); } } else { if ($this->mode === self::HEXADECIMAL) { $hash1 = hexdec($hash1); $hash2 = hexdec($hash2); } $dh = 0; for ($i = 0; $i < 64; $i++) { $k = 1 << $i; if (($hash1 & $k) !== ($hash2 & $k)) { $dh++; } } } return $dh; }