高级算法问题(200分)

  • 主题发起人 主题发起人 westdog
  • 开始时间 开始时间
W

westdog

Unregistered / Unconfirmed
GUEST, unregistred user!
1、我希望有这样一个哈希(散列)函数,把一个dword类型的数字x平均分布到0..MaxHX区间内,但是我不希望连续的两个x(譬如1000和1001)散列后也相邻,最好连续的x之间散列后越分散越好。
2、我希望该算法很简单,即处理速度要快。
 
看大学计算机课程<<算法分析>>第5章。
 
>>平均分布到0..MaxHX区间内
难度比较大——除非MaxHX是2的整数次方——才稍容易一些。
>>连续的两个x...
除非你的算法很糟糕(或者运气很差),否则就不会出现这个问题。
现在有很多算法可以做到两个相差1bit的二进制数Hash之后的结果有一半的二进制位不同。
(比如32bit的结果中有16bit不同)。
 
能否给出具体算法?
 
function HashInt(const N:Integer):Integer;
var
m:Integer;
pb0,pb1,pb2,pb3:PByte;
b:Byte;
begin
m:=N;
pb0:=@m;
pb1:=PByte(Integer(pb0)+1);
pb2:=PByte(Integer(pb0)+2);
pb3:=PByte(Integer(pb0)+3);
b:=$9a xor pb0^ xor pb1^ xor pb2^ xor pb3^;
pb1^:=pb1^+pb0^ xor $39;
pb2^:=pb2^+pb1^ xor $4A;
pb3^:=pb3^+pb2^ xor $5B;
pb2^:=pb2^+pb3^ xor $D1 xor b;
pb1^:=pb1^+pb2^ xor $C6;
pb0^:=pb0^+pb1^;
pb2^:=(pb2^-pb0^) xor b;
Result:=-(N div (b+345)) xor m;
end;

效果极佳!相邻数字的间隔十分散乱。
-151060733 -284236303 -13439367 58500332 109025423 2067055409 50010348
-16707700 -6248628 -360176733 -16711134 117395065 392843014
至于限制区间,很简单,只要用 DWord(HashInt(n)) mod MaxValue 即可(0..MaxValue-1)
 
接受答案了.
 
后退
顶部