`

创建一个简单的短链服务类

阅读更多

整理一个简单的短链算法,整理到自己的代码库中:

 

<?php
/**
 * 短链服务
 * @author vb2005xu
 */
class Service_ShortUrlGenerator
{
	
	private static $table = 'short_url';
	
	private static $list = array();
	
    function __construct(array $config)
    {
        if ( empty($config['db']) )
        {
        	throw BaseError::invalid_parameters_error('key "db" not set');
        }        
        $this->_db = $config['db'];
    }
    
    /**
     * 获取指定用户创建的短链集合
     *
     * @param int $uid
     * @param int $skip
     * @param int $limit
     * 
     * @return array
     */
    function getAllByUid( $uid , $skip=0, $limit=10 )
    {
    	$rows = DataSource::instance($this->_db)->select(self::$table,array(
    					'uid' => $uid,
    				),'*',null,$skip,$limit);
    				
    	return $rows;
    }
    
    /**
     * 获取指定用户创建的短链总数
     *
     * @param int $uid
     * 
     * @return int
     */
    function getCountByUid( $uid )
    {
    	return DataSource::instance($this->_db)->count(self::$table,array(
    					'uid' => $uid,
    				));
    }
    
    /**
     * 通过短链标识 获取对应的 url
     *
     * @param string $identify
     * @param int 	 $uid
     * 
     * @return string
     */
    function decode( $identify , $uid )
    {
    	$uid = intval($uid);
    	if ( !empty($identify) && $uid > 0 ) 
    	{
    		$identify = trim($identify);
    		if ( strlen( $identify ) == 6 )
    		{
    			if ( !isset( self::$list[$id] ) )
    			{
    				$row = DataSource::instance($this->_db)->find_one(self::$table,array(
    					'uid' => $uid,
    					'identify' => $identify,
    				),'link');
    				
    				self::$list[$identify] = empty($row['link']) ? NULL : $row['link'];
    			}
    			
    			return self::$list[$identify];
    		}
    	}
    	return null;
    }
    
	/**
	 * 返回6位的短链标识
	 *
	 * @param string $url
	 * 
	 * @return string
	 */
	function encode( $url , $uid  )
	{
		$uid = intval($uid);
    	if ( !empty($url) && $uid > 0 ) 
    	{
    		$url = trim($url);
    		$identify = self::generate( $url );
    		
    		# 放在此处做下缓存
    		self::$list[$identify] = $url;
    		
    		# 因为 uid + identify 做了唯一键索引,故此处不进行数据存在校验
    		DataSource::instance($this->_db)->insert(self::$table,array(
    			'uid' => $uid,
    			'identify' => $identify,
    			'link' => $link,
    			'create_at' => APP_START_TIMESTAMP,
    		));
    		
    		return $identify;
    	}
		return null;
	}
	
	/**
	 * 返回6位的短链标识
	 *
	 * @param string $url
	 * 
	 * @return string
	 */
	static function identify( $url )
	{
		if ( empty($url) ) return FALSE;
		return self::code62( sprintf("%u", crc32($url)) );
	}

	private static function code62($x) {
		$show = '';
		while($x > 0) {
			$s = $x % 62;
			if ($s > 35) {
				$s = chr($s+61);
			} elseif ($s > 9 && $s <=35) {
				$s = chr($s + 55);
			}
			$show .= $s;
			$x = floor($x/62);
		}
		return $show;
	}
}

 

分享到:
评论

相关推荐

    创建一个Computer类

    准备工作:创建一个Computer类 要求成员变量包括如下: (1)编号(即计算机的唯一标识) (2)CPU型号, (3)主板型号, (4)硬盘大小, (5)内存大小, (6)显卡型号, (7)价格, 题目: (1)要求使用ArrayList存储...

    创建一个叫做People的类

    具有属性:姓名、年龄、性别、身高;...创建主类,在主类中创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法:说出“你好!”,计算23+45的值,并将名字改为“李四”。

    创建一个PEOPLE类

    创建一个PEOPLE类,创建一个People类,定义成员变量如身份证号、姓名、性别、年龄;定义成员方法“获取身份证号”、“获取姓名”、“获取年龄”等,再创建People类的对象。

    C++创建window服务

    创建该服务仅用到一个 C++ 类,这个类提供服务与操作系统之间一个简单的接口。使用这个类实现自己的服务非常简单,只要改写少数几个基类中的虚拟函数即可。在本文有三个源代码参考例子: • NTService 是一个简单的...

    先创建一个Point类,然后定义Trianglele类

    先创建一个Point类,然后定义Trianglele类。在Trianglele类中定义三个Point的实体来表示一个三角形的三个点,再定义构造方法对这三个点进行初始化,然后定义两个方法求三角形的周长、面积。定义一个测试类,在main()...

    用 C++ 创建简单的 Win32 服务程序 ntservicectrl.rar

    创建该服务仅用到一个 C++ 类,这个类提供服务与操作系统之间一个简单的接口。使用这个类实现自己的服务非常简单,只要改写少数几个基类中的虚拟函数即可。在本文有三个源代码参考例子: NTService 是一个简单的 ...

    一个简单的学生课程系统,可以创建学生,课程,成绩,以及计算最高对分。

    题目描述:一个简单的学生课程系统,可以创建学生,课程,成绩,以及计算最高对分。 功能要求: (1) 创建一个学生类,包含学号,姓名,性别。 (2) 创建一个课程成绩类,包含课程名称和成绩。 (3) 创建一个学生课程...

    创建一个桌子类,桌子名称,重量,宽度,长度

    创建一个桌子Table类,该类中有桌子名称,重量,桌面宽度,长度及桌子高度属性。其中有:构造函数初始化所有数据成员;Area() :计算桌面的面积; Display(): 在屏幕上输出所有数据成员的值;ChangeWeight(int ):改变...

    java创建一个简单的Maven项目

    java创建一个简单的Maven项目java创建一个简单的Maven项目java创建一个简单的Maven项目java创建一个简单的Maven项目java创建一个简单的Maven项目java创建一个简单的Maven项目java创建一个简单的Maven项目java创建一...

    使用 C# 创建一个 FTP 服务器

    使用 C# 创建一个 FTP 服务器,供大家一起共同分享学习。

    用 C++ 创建简单的 Win32 服务程序

    《用 C++ 创建简单的 Win32 服务程序》一文的例子代码。描述如何用 Visual C++ 创建 Windows NT 服务程序。创建该服务仅用到一个 C++ 类,这个类提供服务与操作系统之间一个简单的接口。使用这个类实现自己的服务...

    java 使用 Swagger 创建一个Spring Boot 的 Web 服务

    java 使用 Swagger 创建一个Spring Boot 的 Web 服务java 使用 Swagger 创建一个Spring Boot 的 Web 服务java 使用 Swagger 创建一个Spring Boot 的 Web 服务java 使用 Swagger 创建一个Spring Boot 的 Web 服务java...

    简单Web服务的创建、测试以及详细文档+精彩实例(代码注释详细)

    Web服务英文名为WebService,简单的说就是一种应用程序,使用标准的互联网协议,在网上提供一个函数接口,用户可以在任何地方调用Web服务。本文档就是结合实际的例子来探讨Web服务的创建、测试和使用。详细内容包括...

    构建一个简单的HTTP服务器的C#程序实例Ky_HttpServer.rar

    构建一个简单的HTTP服务器的C#程序实例。实现响应GET、POST请求。在服务端创建一个tcp通信来负责...每一次监听程序都会创建一个新的TcpClien,HttpServer类又会创建一个新的HttpProcessor,然后启动一个线程来操作。

    创建一个关于汽车的类

    该类描述的是关于汽车的车牌行驶速度以及行驶状态

    一个用于创建服务的类

    一个用于创建服务的类, 只需在派生类中实现Run和Stop函数即可。

    java课后习题 关于 编写一个类

    16.编写一个类A,该类创建的对象可以调用方法f 输出英文字母表,然后再编写一个该类的子类B,要求 子类B 必须继承A 类的方法f(不允许重写),子类创建的对象不仅可以调用方法f 输出英文字母表,而 且调用子类新增的...

    mojo案例.docx 以下是一个简单的使用Mojo编程语言的示例,演示如何创建一个简单的Web服务器并返回Hello Wo

    在这个示例中,我们首先导入了Mojo框架,并创建了一个继承自 `Mojolicious` 的类 `MyApp`。然后,在 `startup` 方法中定义了一个简单的路由,当收到根路径的 GET 请求时,返回 "Hello World!"。最后,创建了一个应用...

    详解C# 利用反射根据类名创建类的实例对象

    1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile&#40;程序集路径,不能是相对路径&#41;; // 加载程序集(EXE 或 DLL) dynamic obj = assembly....

    设计一个Person类,有Person类派生一个Student类和一个Teacher类

    设计一个Person类,有Person类派生一个Student类和一个Teacher类,Student类包括姓名,编号,和成绩。Teacher类包括姓名,编号,职务和部门。又要用的来下载啊,希望对你有所帮助。

Global site tag (gtag.js) - Google Analytics