2010-04-19 129 views

回答

2

你并不需要,因为它已经存在,实现它: http://php.net/manual/en/function.gmp-hamdist.php

(如果你有GMP支持)

+0

我使用PHP5.3,但没有php_gmp.dll – user198729 2010-04-19 12:10:05

+0

在XAMPP的Windows发行,你可以找到一个副本:http://www.apachefriends.org/en/xampp.html – zaf 2010-04-19 13:39:21

0

尝试:

echo gmp_hamdist('10101010','01010101') 
+0

哪里可以下载用于PHP5.3.0的php_gmp.dll? – user198729 2010-04-19 12:13:29

+0

看看在http://www.php.net/manual/en/gmp.installation.php – binaryLV 2010-04-19 12:16:49

+0

评论有没有我需要的DLL。 – user198729 2010-04-19 12:25:24

0

试试这个功能:

function hamming($b1, $b2) { 
    $b1 = ltrim($b1, '0'); 
    $b2 = ltrim($b2, '0'); 
    $l1 = strlen($b1); 
    $l2 = strlen($b2); 
    $n = min($l1, $l2); 
    $d = max($l1, $l2) - $n; 
    for ($i=0; $i<$n; ++$i) { 
     if ($b1[$l1-$i] != $b2[$l2-$i]) { 
      ++$d; 
     } 
    } 
    return $d; 
} 
1

如果您没有GMP支持,总会有这样的情况。它只能在长达32位的二进制字符串上运行。

function hamdist($x, $y){ 
    for($dist = 0, $val = $x^$y; $val; ++$dist){ 
     $val &= $val - 1; 
    } 
    return $dist; 
} 

function hamdist_str($x, $y){ 
    return hamdist(bindec($x), bindec($y)); 
} 


echo hamdist_str('10101010','01010101'); //8 
5

而不这里安装GMP为任何相同长度的简单的解决方案的二进制串

function HammingDistance($bin1, $bin2) { 
    $a1 = str_split($bin1); 
    $a2 = str_split($bin2); 
    $dh = 0; 
    for ($i = 0; $i < count($a1); $i++) 
     if($a1[$i] != $a2[$i]) $dh++; 
    return $dh; 
} 

echo HammingDistance('10101010','01010101'); //returns 8 
1

下面的函数可与十六进制字符串(长度相等),大于32位长。

function hamming($hash1, $hash2) { 
     $dh = 0; 

     $len1 = strlen($hash1); 
     $len2 = strlen($hash2); 
     $len = 0; 

     do { 
      $h1 = hexdec(substr($hash1, $len, 8)); 
      $h2 = hexdec(substr($hash2, $len, 8)); 
      $len += 8; 
      for ($i = 0; $i < 32; $i++) { 
       $k = (1 << $i); 
       if (($h1 & $k) !== ($h2 & $k)) { 
        $dh++; 
       } 
      } 
     } while ($len < $len1); 

     return $dh; 
    }