⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.c

📁 用于GPRS远程电力抄表系统中采集器端的程序
💻 C
字号:
#include "hash.h"

static code U32  box[] = 
{
    0x9dad7287, // 0x000    
    0xb1cf8e83, // 0x010    
    0x7ea820c4, // 0x020     
    0x99404a66, // 0x030     
    0x4f481d45, // 0x040    
    0x32889d2c, // 0x050    
    0x698c0cca, // 0x060    
    0xfd6d6e31, // 0x070     
    0xefb10c53, // 0x080    
    0x2092bd13, // 0x090    
    0x2672c073, // 0x0a0     
    0x378453a7, // 0x0b0    
    0x3ff6d550, // 0x0c0     
    0x06316131, // 0x0d0     
    0xe94aeb76, // 0x0e0     
    0x54c1f029, // 0x0f0     
    0x58872a69, // 0x100    
    0x720a1dc3, // 0x110      
    0x006662b6, // 0x120    
    0x3b14d84f, // 0x130     
    0x810f23bb, // 0x140    
    0xa6c5e650, // 0x150    
    0xcb5b3089, // 0x160     
    0x7f38d0ee, // 0x170     
    0xc7922c20, // 0x180    
    0xa6c0496d, // 0x190     
    0x1b4c67f2, // 0x1a0     
    0x20211e44, // 0x1b0     
    0x80f594f9, // 0x1c0    
    0x389b1bbf, // 0x1d0    
    0xae8b5fcf, // 0x1e0    
    0xda30d0fb  // 0x1f0    
};

U8 Hash(U8 tl,U8 th,U8 *addr,U8 const len)
{

	static U8 xdata box_area1[32];
	static U8 xdata box_area2[32];
	static U8 xdata box_area3[32];

 	static U8 i,j,k;
	static U32 cnt=0;//0xFFdc8fe1; //计数器
	static LENFLAG=0;

 	U16 ntl=0;
 	U16 nth=0;
 	U32 naddr=0;
 	U32 rval;
 
 	int m,n;
  

 	for(n=0;n<3;n++)
	 	naddr=(naddr<<8)+addr[n];
 
	if(LENFLAG!=len)
	{
		LENFLAG=len;
 		for(n=1;n<=31;n++)
 		{
  			box_area1[n]=(len+cnt+n)%31;
  			box_area2[n]=(len+cnt+n)%31;
  			box_area3[n]=(len+cnt+4*n)%31;
 		}
	}


 //获取下标
 	switch(tl%3)
 	{ 
 		case 0:
 			i=box_area1[(cnt^(~j))%31];
 			break;
 		case 1:
 			i=box_area2[(cnt^(~j))%31];
 			break;
 		case 2:
 			i=box_area3[(cnt^(~j))%31];
 	}

 	switch(th%3)
 	{ 
		case 0:
 			j=box_area1[(cnt^(~i))%31];
 			break;
 		case 1:
 			j=box_area2[(cnt^(~i))%31];
 			break;
 		case 2:
 			j=box_area3[(cnt^(~i))%31];
 	}

 	switch(naddr%3)
 	{ 
		case 0:
 			k=box_area1[(cnt+k)%31];
 			break;
 		case 1:
			 k=box_area2[(cnt+k)%31];
 			break;
 		case 2:
 			k=box_area3[(cnt+k)%31];
 	}

 	ntl=tl&0xFFFFFFFF;
 	nth=th&0xFFFFFFFF;
        m=8;
	do{
 		ntl|=~(ntl<<m+j);
 		nth|=~(nth<<m+i);
 		naddr|=~(naddr<<m+k);
		m-=8;
	}while(m>=0);

 

	rval=(ntl^box[i+(ntl&0x20)]);
	rval+=(nth^box[j+(nth&0x20)]);
	rval+=(naddr^box[k+(naddr&0x20)]);


	cnt++;

	if(!(rval&len))
		return len;
		
	if(!(rval%len))
		return rval&len;

	return rval%len;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -