`
strayly
  • 浏览: 97450 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

php计算海明距离(64位)查找相似文档

    博客分类:
  • php
 
阅读更多
<?php
class Simhash { 

	public $m_hash = null;
	public $hashbits = null;
	public $code = null;
	public $m_hashbits = 64;

	public function __construct($code='UTF-8'){
		$this->code = $code;
	}
	public function __toString(){
		return strval($this->m_hash);
	}

	//返回hash值
	public function simhash($tokens){
		foreach($tokens as $x){
			$x = $this->string_hash($x);
			for($i=0;$i<$this->m_hashbits;$i++){
				$bitmask = gmp_init(1);
				gmp_setbit($bitmask, $i);
				$bitmask = gmp_sub($bitmask,1);
				if (gmp_strval(gmp_and($x,$bitmask)) != "0") $v[$i] += 1;
				else $v[$i] -= 1;
			}
		}
		$sum = 0;
		for($i=0;$i<$this->m_hashbits;$i++){
			if ($v[$i] >= 0){
				$num = gmp_init(1);
				gmp_setbit($num, $i);
				$num = gmp_sub($num,1);
				$sum = gmp_add($sum,$num);
			}
		}
		$this->m_hash = gmp_strval($sum);
		return $this->m_hash;
	}

	//求海明距离
	public function hamming_distance($hash1,$hash2){
		$hash1 = strval($hash1);
		$hash2 = strval($hash2);
		$a = gmp_init($hash1);
		$b = gmp_init($hash2);
		$c = gmp_init(1);
		gmp_setbit($c, $this->m_hashbits);
		$c = gmp_sub($c,2);
		$x = gmp_and(gmp_xor($a,$b),$c);
		$tot = 0;
		while(gmp_strval($x)){
			$tot += 1;
			$x = gmp_and($x,gmp_sub($x,1));
		}
		return $tot;
	}

	public function string_hash($source){
		if(empty($source)) return 0;
		else{
			$x = $this->utf8_unicode(mb_substr($source,0,1,$this->code)) << 7;
			$m = 1000003;
			$mask = gmp_sub(gmp_pow("2", $this->m_hashbits),1);
			$len = mb_strlen($source,$this->code);
			for($i=0;$i<$len;$i++){
				$x = gmp_and(gmp_xor(gmp_mul($x,$m),$this->utf8_unicode(mb_substr($source,$i,1,$this->code))),$mask);
			}
			$x = gmp_xor($x,$len);
			if(intval(gmp_strval($x)) == -1) $x = -2;
			return $x;
		}
	}
	function utf8_unicode($c) {
		switch(strlen($c)) {
			case 1:
			return ord($c);
			case 2:
				$n = (ord($c[0]) & 0x3f) << 6;
				$n += ord($c[1]) & 0x3f;
			return $n;
			case 3:
				$n = (ord($c[0]) & 0x1f) << 12;
				$n += (ord($c[1]) & 0x3f) << 6;
				$n += ord($c[2]) & 0x3f;
			return $n;
			case 4:
				$n = (ord($c[0]) & 0x0f) << 18;
				$n += (ord($c[1]) & 0x3f) << 12;
				$n += (ord($c[2]) & 0x3f) << 6;
				$n += ord($c[3]) & 0x3f;
			return $n;
		}
	}

	function dec_to_bin($dec='') {
		$bin = '';
		if($this->is_64bit()){
			$bin = decbin(intval($dec));
		}
		else{
			while ($dec) {
				$m = bcmod($dec, 2);
				$dec = bcdiv($dec, 2);
				$bin .= abs($m);
			}
			$bin = strrev($bin);
		}
		if(strlen($bin)<$this->m_hashbits)$bin = str_pad($bin,$this->m_hashbits,"0",STR_PAD_LEFT);
		unset($dec);unset($m);
		return $bin;
	}
	function bin_to_dec($input='') {
	  if($this->is_64bit()){
		  $output = bindec($input);
	  }
	  else{
		  $output='0';
		  if(preg_match("/^[01]+$/",$input)) {
			for($i=0;$i<strlen($input);$i++)
			  $output=bcadd(bcmul($output,'2'),$input{$i});
		  }
		  if(strpos($output,'.')!==false){
			  $arr = explode('.',$output);
			  $output = $arr[0];
		  }
	  }
	  return($output);
	}
	function is_64bit() {
		return false;
	}

}

?>
分享到:
评论

相关推荐

    SimHash-java实现及海明距离

    对于两个二进制表示的字符串,海明距离定义为使一个字符串转换成另一个字符串所需的最少单字符替换次数。在SimHash中,如果两个文本的SimHash值有较少的位不同,那么它们被认为具有较高的相似度。通常,如果两个...

    中文文本相似度匹配算法 simHash 海明距离 IK分词

    使用IK分词器,我们可以先对输入的中文文本进行分词,然后利用simHash算法计算文本的哈希值,并通过海明距离计算不同文本之间的相似度。 总结来说,simHash、海明距离和IK分词是中文文本相似度匹配的关键技术。...

    论文计算相似度——基于SimHash算法和海明距离

    命令行输入两个txt文件的绝对路径,计算相似度,写进txt文件

    海明码详解(如何计算海明码)

    第一个例子中,信息位1011,通过计算得到的海明码是1010101。第二个例子中,8位信息的海明码接收到了110010100000,通过校验位的验证,可以确定第四个位有误,因此原始信息位可能是100010100000。 海明码的优点在于...

    海量文档相似性计算引擎方案

    综上所述,海量文档相似性计算引擎方案是一个复杂而全面的技术方案,它利用SimHash算法生成文档数字签名,通过海明距离计算文档间相似度,借助中文分词技术和TF-IDF算法进行文本分析和处理,采用分布式计算应对大...

    计算机课程设计-海明码的实现

    3.4 详细设计:具体实现各个模块的算法,包括编码函数(生成校验位)、校验函数(计算海明距离)、解码函数(根据错误位纠正数据)以及错误纠正函数(判断错误类型并进行纠正)。 四、心得体会 在本次课程设计中,...

    海明码计算解析案例

    ### 海明码计算解析案例知识点详述 #### 一、海明码基本概念 - **定义**: 海明码是一种能够检测并纠正单个比特错误的线性码。它通过添加若干个冗余位(监督位)来实现错误检测与纠正的功能。 - **原理**: 在海明码...

    计算机海明编码.zip

    海明距离是指两个码字之间不同位的数量。一个具有n位的码字可以纠正最多t位错误,前提是码字集合满足汉明界条件:2^(t+1) - 1 ^n。例如,7位的海明码(也称为海明(7,4)码)可以纠正单个比特错误,因为它有3个校验位...

    海明码的计算 ppt

    海明距离是指两个码字之间的差异位数,如果一个码字与正确码字的海明距离为1,那么可以准确定位到错误位。 4. **纠正错误**:一旦确定了错误位置,就可以将该位置的错误比特替换为正确的值,从而完成错误纠正。 ...

    <<海明编码>>测试软件

    例如,一个具有三个校验位的海明编码可以检测并纠正单个比特错误,因为其最小海明距离为4。 在实际应用中,海明编码的过程包括编码和解码两个步骤: 1. **编码**:给定一段原始数据,首先计算出需要的校验位。这...

    基于Simhash算法的海量文本相似性检测方法研究.pdf

    通过海明距离来检测文档之间的相似程度,能够更加精确地对相似的文档进行排序和推荐。 最终,本文通过实验验证了改进的Simhash算法的有效性。实验采用了民机研制领域的工序数据作为测试样本,结果显示改进方案的...

    海明码教程解析示例……

    2. **海明距离**:海明距离是衡量两个码字之间差异的度量,即改变一个码字中多少位才能得到另一个码字。海明码的设计保证了任何两个合法码字的海明距离至少为3,这样能确保检测并纠正单个比特错误,同时检测双比特...

    crc与海明码仿真计算软件

    每个海明码都有一个编码距离,它定义了海明码可以纠正的最大错误数量。编码过程涉及到编码器的构建,其中包括了编码矩阵的生成和乘法操作。 在这个“crc与海明码仿真计算软件”中,用户可以输入任意的码串,软件会...

    海明校验码--计算机组成原理

    ### 海明校验码详解 #### 一、海明校验码简介 海明校验码是一种在数据传输过程中用于检测并纠正单比特错误的校验方法,在计算机组成原理中占据重要地位。该方法由Richard Hamming在1950年代初提出,其主要特点是...

    MySimHash.java

    使用simhash进行文本查重,计算海明距离,海明距离越小说明越相似,例子: 文本一:使用simhash进行文本查重,计算海明距离,海明距离越小说明越相似 文本二:一个查重算法,计算海明距离,海明距离越小说明越相似 ...

    基于Java的相似图片搜索.pdf

    6、海明距离计算技术:海明距离计算是相似图片搜索的重要步骤。通过计算图片指纹之间的海明距离,能够得出图片的相似度。 7、相似图片搜索引擎:相似图片搜索引擎是基于相似图片搜索技术的应用实例。常见的相似图片...

    海明码算法实现(c语言)

    - **构建海明码**:`creat_han(int n, int k)`函数是核心部分,负责计算校验位的值并将它们插入到数据位之间,形成完整的海明码。 - **错误检测与修正**:`f1(int k, int n, int d2[])`函数用于检测数据中的错误,并...

    基于海明权距离的矿井通风系统方案优选

    基于阳泉煤业集团某矿通风系统,从安全可靠、技术可行、经济合理3个方面综合考虑,分析、建立...通过引入海明权距离对该矿通风系统方案进行了优化评判。方案实施结果表明目前矿井通风系统运行状态达到了合理优化的目标。

    组成原理课程设计生成海明码

    海明码的校验位数k与数据位数n的关系遵循公式2^k &gt;= k + n + 1,确保每个数据位至少参与三个校验位的计算。 2. **海明码生成规律**:校验位被放置于海明码中2^i-1的位置,其余位置为数据位。每个数据位和校验位都...

Global site tag (gtag.js) - Google Analytics