手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

一件挫事

之前在給數據做緩存的時候做了一件挫事:
將某個數據表進行了cache,數據索引的鍵是該表的某個字段 。這個數據我是一般不會動它的,但是我需要知道這個表中最大的xxx_ID(索引字段)是什麼。
當然是有兩個辦法:
1、select max(xxx_id) from table
2、直接將緩存中最大的xxx_ID取出來就完事了

我用的是第二種,因為我order by 的時候是xxx_id ASC,於是我想當然的就直接array_keys($data),然後array_pop一下,最後彈出的這個xxx_ID就是最大的xxx_ID

但理想往往都是與現實相反的,不知道為什麼,它就是沒按順序排。。於是我array_pop死出彈不出我要的數值。
想了半天,突然想到。。。max不就完了嗎?於是蛋疼N久的問題一下子就解決了。何苦那麼累呢。哎。。。

腦子真的有時候是轉不過彎啊

最小完美哈希函数

不好意思,这是一个标题党,主要是这个词语太让人震惊,但现在它又将变的地了。所以我先记录一下。

什么是完美哈希函数?
這一段內容來自:(http://www.kuqin.com/algorithm/20111108/314569.html)
最小完美哈希函数是什么,要从定义说起,这个名字很长,一步步解释。

  1. 哈希函数 任意函数h(x)都可以说哈希函数,一般来说,一个良好的哈希函数可以尽量避免重复。x的集合是参数域,h(x)的集合是值域。
  2. 完美哈希函数  完美哈希函数,就是完全不会冲突的哈希函数,这要求函数的值域至少比参数域要大
  3. 最小完美哈希函数 最小完美哈希函数,就是指函数的值域和参数域的大小完全相等,一个也不多
  4. 保序最小完美哈希函数 保序的意思就是指这个哈希之后顺序是不变的,同时还能满足其他两个条件。
这个函数的优点就是形式上很完美,就像给一个排好序的文档编上的序号一般紧凑可靠。但是这个函数有两个缺点,一是必须事前必须知道原数据集,二 是需要花一定的CPU来生成这个函数。我认为,对于数据仓库类的线下搜索应用,这个算法是有用武之地的。但对于强调实时的数据业务,这个算法是不适合的。
----------
這裏還有一個點評:(http://liulixiang.info/blog/tag/%E6%9C%80%E5%B0%8F%E5%AE%8C%E7%BE%8E%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0/)

点评:(by liulixiang)

“最小完美哈希函数”从概念上很完美,生成的思想也很不错,不过实际运用中并不是那么常见:应用中已知数据集再做哈希的情况不是特别多,对时空的复杂度要求也没有过于苛刻,普通的方法即可承受。另外一般数据集很大,生成该函数的开销也太大。

---------
參考文檔:

最小完美哈希函数方法来自于Czech, Havas, Majewski等的论文:

An optimal algorithm for generating minimal perfect hash functions(Czech等1991)

Graphs, hypergraphs and hashing(Havas等1993)

A family of perfect hashing methods(Majeki等1996)

本文大部分转述或摘抄自《深入搜索引擎——海量信息的压缩、索引和查询》(该书豆瓣链接) 一书(Page 173~181),该书由梁斌翻译(原版即大名鼎鼎的MG——“Managing Gigabytes: Compressing and Indexing Documents and Image, Second Edition” 由Ian H. Witten, Alistair Moffat, Timothy C.Bell合著)(MG网站

count_chars的另类作用

count_chars表面上是計算char出現的次數,但事實上對中文支持明顯是不好的。
所以,它還有另外一個作用,即count_chars($str,4);
看好第二個參數哦。當這個參數是4時,會返回所有的会用作计算的字符串:

XML/HTML代码
  1.  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`defghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™šœžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¹»¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãæçèéêëìíîïðñòóôõö÷øùúûüýþÿ  

嗯,因此这也算是一个小技巧啦。

yiiredis的一个小BUG

yiiredis是基于phpredis的一个YII组件。平时用的话确实也挺方便,但偶尔还是会有一些小BUG,比如说:
yiiredis自带了计数器的功能,嗯,它是调用了phpredis裏的代碼:
$counter = new ARedisCounter($key);
$counter->increment();  //表示每次加1
echo $counter->getValue();

這樣的代碼是沒有任何問題的,但問題卻出現在了:
$counter = new ARedisCounter($key);
echo $counter->getValue();

上面的代碼好象沒有任何問題?但就因為這樣寫,程序崩潰了。。
NND,你不先加1,就不能取$counter->getValue();
這尼瑪也太坑爹了吧。。。。。你好歹默認一個0嘛。

Tags: yiiredis

str_word_count的想当然

看到str_word_count的時候,想當然的認為它就是統計字符串中某些單詞出現的次數。结果,根本不是這樣,只是統考這個單詞出現在第幾位。我TNND。
然後一猶豫,我就寫了一個函數:

PHP代码
  1. function getStrCounts($str,$findstr='%s'){  
  2.     $i =$s= 0;  
  3.     while(($s = strpos($str,$findstr,!$s?0:$s+count($findstr)))!==false){  
  4.         $i ++;  
  5.     }  
  6.     return $i;  
  7. }  

等我写完后,发现,果然不错耶。然后我TNND又看了一下手册。。因为我记得这玩意确实是有函数的。找了一下,果然还真TMD有。substr_count就是这个苦逼的函数:

PHP代码
  1. $format = "There are %s monkeys in the %s %s %s";  
  2. echo substr_count($format,"%s");  


我晕啊。这个count,你为什么要扔到substr_这个前缀后面???真受不了。这个问题好象很久以前也有人提过,看来苦逼的人不是我一个啊