`
strayly
  • 浏览: 93578 次
  • 性别: 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 海明距离 IK分词

    中文文本相似度匹配算法 simHash 海明距离 IK分词 完整的可运行的示例代码 包含simHash 算法,使用IK 对中文文本进行分词处理

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

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

    海明码计算解析案例

    海明码计算解析案例 海明码计算解析案例 海明码计算解析案例 海明码计算解析案例

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

    k位的校验码可以有2^k个值。显然,其中一个值表示数据是正确的,而剩下的2^k –1个值意味着数据中存在错误,如果能够满足: 2^k–1&gt;=m + k (m + k为编码后的总长度),在理论上k个校验码就可以判断是哪一位(包括信息...

    海明码和CRC校验的C语言实现

    海明码和CRC校验的C语言实现 1.海明码 //code by zxf 2010.4.10 #include ...//计算海明码校验位位数 void InCode(char *data,char *c,int k,int r);//计算海明码每个校验位的数值 void main() {

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

    计算机组成原理里面的海明校验码,有详细的步骤过程。可以使学习者更加方便快捷计算机组成原理里面的海明校验码,有详细的步骤过程。可以使学习者更加方便快捷计算机组成原理里面的海明校验码,有详细的步骤过程。...

    MySimHash.java

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

    海明码的计算 ppt

    海明码的计算 海明码是一种可以纠正单个差错的编码。每个码字包含m个数据位和r个冗余位(校验位)。对于给定m的情况下,用于纠正单个差错所需要的校验位的最少数目r必须满足:

    crc与海明码仿真计算软件

    一个可以用于计算任意码串的CRC编码或者海明编码软件,并且具有计算过程的动态演示效果,可以用于计算机网络原理编码的辅助学习

    华中科技大学-计算机组成原理-educoder Logisim-计算机数据表示实验(HUST) 答案代码

    华中科技大学-计算机组成原理-educoder Logisim-计算机数据...第5关:16位海明编码电路设计 第6关:16位海明解码电路设计 第7关:海明编码流水传输实验 第8关:16位CRC并行编解码电路设计 第9关:CRC编码流水传输实验

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

    因此,当传送端与接收端的比特样式的汉明距离 (Hamming distance) 小于或等于1时(仅有 1 bit 发生错误),可实现可靠的通信。相对的,简单的奇偶检验码除了不能纠正错误之外,也只能侦测出奇数个的错误。

    论文研究-一种快速而准确的虹膜识别方法.pdf

    提出了一种快速而准确的虹膜识别算法,基本思想是:通过图像预处理,确定虹膜的位置和大小,并将直角坐标系下的环形虹膜展开成极坐标系下的矩形虹膜;...计算两个虹膜编码之间的海明距离,根据海明距离给出识别结果。

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

    包含计算机组成原理生成海明码的报告和电路连接图。

    海明校验 python源代码 海明码

    今天上了一节组原,讲了Hamming Code,对它的代码实现比较感兴趣,于是给自己出了个题目去玩。可以海明编码,也可海明校验。

    16位海明编码电路设计1-5.circ

    在 logisim 中打开实验资料包中的 data.circ 文件,在...输出:2222位校验码(1616位数据位+55位校验位+11位总校验位),注意输入1616位原始数据的每一位都已经通过分线器利用隧道标签引出,可以直接复制到绘图区使用。

    海明码的计算及校验 C实现

    程序使用dev++编译,使用VC++编译可能会报错。 1、生成汉明编码 输入:任意一个字符串 输出:生成的经过汉明编码的结果 ...2、汉明编码的校验 ...输入:任意一个经过汉明编码的结果 ...输出:若无错误,可输出“无错误”...

    java实现的海明码

    两种不同的做法,用java实现海明码,先输入一个数据,得到海明码,在输入海明码,如果错误,则提示哪位出错且纠正为正确的海明码

    海明码生成与校验电路的设计.rar

    海明校验码是由理查得•...海明码的每一位Hi(包含数据位和校验位本身)由多个校验位校验,其关系是被校验的每一位位号要等于校验它的各校验位的位号之和。这样安排的目的,是希望校验的结果能正确反映出出错位的位号。

Global site tag (gtag.js) - Google Analytics