现在的位置: 首页PHP技术 > 正文
PHP:md5的返回值转化为两个int64的方法
关键词:无 ┊ 来源: 原创收藏

背景:


在正常应用时,通常我们是直接使用md5对一个string类型的变量进行
加密,返回长度为32的十六进制表示的字符串,然后将其存储到mysql中。
现在如果在这个md5字符串建立索引,检索速度就不是很理想,现在需要改进的是将md5字符
串转化为两个int64的整数,然后在这个上面建立索引,检索速度会提高很多。


问题:


如何将十六进制字符串转化为int64?

最简单的方法就是利用乘法运算直接进行转化,这时问题就出现了:由于php内部实现是所有的int都是 有符号的 long 表示的,
当值超过2^63-1(-2^63-1 至 2^63 -1)时,会自动转化为double类型,这时可能就会有数据丢失。
这时需要解决是如果在整数进行乘法运算时,如何不让其自动转化为double型,因为long型完全可以表示,至多溢出时表示为对应的负数,
但是满足全局唯一性。


解决方案:


位运算: *16 对应于=> <<4 左移四位 加法对应于 => | 或运算
实现代码:
$arrRes[0] = intval((($arrRes[0]<<4)|getDecimalVal($arrMd5Val[$i])));
$arrRes[1] = intval((($arrRes[1]<<4)|getDecimalVal($arrMd5Val[$intStrHalfLen + $i])));


代码如下:

/**
 * @brief 返回十六进制字符的十进制标示
 * @param $ch
 * @return integer
 */
function getDecimalVal($ch)
{
    if (is_numeric($ch))
    {
	return intval(ord($ch) - ord('0'));
    }
    else
    {
	return intval(ord($ch) - ord('a') + 10);
    }
}
/**
 * @brief 将md5的返回值转化为两个int64
 * @param $strMd5Val
 * @return array
 */
function getInt64($strMd5Val)
{
    $intStrLen = strlen($strMd5Val);
    $arrMd5Val = array();
    for ($i = 0; $i < $intStrLen; ++$i)
    {
	$arrMd5Val[$i] = substr($strMd5Val, $i, 1);
    }
    $intStrHalfLen = $intStrLen / 2;
    $arrRes = array();
    $arrRes[0] = intval(0);
    $arrRes[1] = intval(0);
    for ($i = 0; $i < $intStrHalfLen; ++$i)
    {
	$arrRes[0] = intval((($arrRes[0]<<4)|getDecimalVal($arrMd5Val[$i])));
	$arrRes[1] = intval((($arrRes[1]<<4)|getDecimalVal($arrMd5Val[$intStrHalfLen + $i])));
    }
    return $arrRes;
}

相关文章
    暂无相关文章
本文由 jack 发布于 1904天 9小时 20分钟前,目前已有 1786 人浏览
欢迎大家转载分享,请注明来源及链接;商业媒体转载请获得授权,谢谢合作!
 

添加评论