2010-04-19 123 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; 
    }