免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2314 | 回复: 5
打印 上一主题 下一主题

Solaris下用nawk如何实现位运算? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-24 20:58 |只看该作者 |倒序浏览
5可用积分
用nawk (仅限于shell,请不要有用python,perl实现的回答),实现ACE中的一个hash算法,源代码如下:
  1. u_long
  2. ACE::hash_pjw (const char *str, size_t len)
  3. {
  4.   u_long hash = 0;

  5.   for (size_t i = 0; i < len; i++)
  6.     {
  7.       const char temp = str[i];
  8.       hash = (hash << 4) + (temp * 13);

  9.       u_long g = hash & 0xf0000000;

  10.       if (g)
  11.         {
  12.           hash ^= (g >> 24);
  13.           hash ^= g;
  14.         }
  15.     }

  16.   return hash;
  17. }
复制代码
以上我用shell已经实现,但效率实在太低,可能我水平有限,写不出高效率的脚本,请达人赐教。
另外,我用gawk实现了这个脚本,效率大大提升,但移植到Solaris下,原生的awk和nawk不支持gawk的位运算操作,请教达人如何用nawk实现呢?

shell的实现:
  1. #!/bin/bash


  2. hash_pjw()
  3. {
  4.     hash=0
  5.     in="$1"
  6.     for (( i = 0; i < ${#in}; ++i ))
  7.     {
  8.         temp=`printf "%d" "'${in:i:1}"`
  9.         hash=$(( (hash<<4) + (temp*13) ))

  10.         g=$(( hash & 0xf0000000 ))
  11.         #echo temp[$temp]hash[$hash]g[$g]
  12.             
  13.         if [ -n "$g" ]; then
  14.             hash=$(( hash ^= (g >> 24) ))
  15.             hash=$(( hash ^= g ))      
  16.         fi
  17.     }
  18.     echo $hash
  19. }     

  20. hash_pjw "$1"
复制代码
gawk的实现:

  1. #!/bin/bash

  2. hash_pjw()
  3. {
  4.     echo "$1" | gawk 'BEGIN{}
  5.     function ord(c)
  6.     {
  7.         for( i=0;i<256;i++ ) {
  8.             ch = sprintf("%c",i);
  9.             assii[ch] = i;
  10.         }
  11.         return assii[c]
  12.     }

  13.     {
  14.         str=$0
  15.         for(j=1;j<=length(str);j++){
  16.             temp = ord( substr(str,j,1) )
  17.             hash = ( lshift(hash,4) + temp*13 )
  18.             g = and(hash,0xf0000000)
  19.             #print temp,hash,g

  20.             if(g){
  21.                 hash = xor(hash,rshift(g,24))
  22.                 hash = xor(hash,g)
  23.             }
  24.         }
  25.         print hash
  26.     }'
  27. }

  28. hash_pjw $1
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2012-02-25 09:29 |只看该作者
Solaris里面用/usr/xpg4/bin/awk可以吗?

论坛徽章:
0
3 [报告]
发表于 2012-02-25 11:54 |只看该作者
回复 2# Shell_HAT

不可以。也不支持。

   

论坛徽章:
0
4 [报告]
发表于 2012-02-28 13:43 |只看该作者
没有大侠能指点一下吗?  如果不用nawk,或者能用shell实现也行, Solaris下执行500次,能够控制在30秒之内就可。

论坛徽章:
0
5 [报告]
发表于 2013-06-27 09:29 |只看该作者
没办法,已转为python实现

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
6 [报告]
发表于 2013-06-27 10:43 |只看该作者
solaris上装个GNU awk不就可以了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP