📄 hash.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 + -