Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5119461
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2009-04-13 10:53:57

恩...或许还有朋友不清楚字符串的哈希函数到底有什么用,这个用处呢,就是将字符串转换成数字,同时让所得数字尽量平均的分布在容器中,换句话说就是让字符串得到相同数字这种情况尽可能少的出现。当然咯...容器太小,内容太多那么再好的算法也没法避免出现冲突 = =b

从网上找到的哈希函数基本上都是C算法的...最后只好从C and Java 算法中整理 and 测试了这些 PHP中的实现方法。有几个经典的算法在 PHP 下会有问题,字符串一长就会全部取 0,那些我就没有再列出来了。代码就看下面咯:

  1. function DJBHash($str) // 0.22
  2. {
  3. $hash = 0;
  4. $n = ($str);
  5. for ($i = 0; $i <$n; $i++)
  6. {
  7. $hash += ($hash <<5 ) + ($str[$i]);
  8. }
  9. return $hash % 701819;
  10. }
  11. function ELFHash($str) // 0.35
  12. {
  13. $hash = $x = 0;
  14. $n = ($str);
  15. for ($i = 0; $i <$n; $i++)
  16. {
  17. $hash = ($hash <<4) + ($str[$i]);
  18. if(($x = $hash & 0xf0000000) != 0)
  19. {
  20. $hash ^= ($x>> 24);
  21. $hash &= ~$x;
  22. }
  23. }
  24. return $hash % 701819;
  25. }
  26. function JSHash($str) // 0.23
  27. {
  28. $hash = 0;
  29. $n = ($str);
  30. for ($i = 0; $i <$n; $i++)
  31. {
  32. $hash ^= (($hash <<5) + ($str[$i]) + ($hash>> 2));
  33. }
  34. return $hash % 701819;
  35. }
  36. function SDBMHash($str) // 0.23
  37. {
  38. $hash = 0 ;
  39. $n = ($str);
  40. for ($i = 0; $i <$n; $i++)
  41. {
  42. $hash = ($str[$i]) + ($hash <<6 ) + ($hash <<16 ) - $hash;
  43. }
  44. return $hash % 701819;
  45. }
  46. function APHash($str) // 0.30
  47. {
  48. $hash = 0 ;
  49. $n = ($str);
  50. for ($i = 0; $i <$n; $i++)
  51. {
  52. if (($i & 1 ) == 0 )
  53. {
  54. $hash ^= (($hash <<7 ) ^ ($str[$i]) ^ ($hash>> 3 ));
  55. }
  56. else
  57. {
  58. $hash ^= ( ~ (($hash <<11 ) ^ ($str[$i]) ^ ($hash>> 5)));
  59. }
  60. }
  61. return $hash % 701819;
  62. }
阅读(1934) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~