W westdog Unregistered / Unconfirmed GUEST, unregistred user! 2002-04-23 #1 1、我希望有这样一个哈希(散列)函数,把一个dword类型的数字x平均分布到0..MaxHX区间内,但是我不希望连续的两个x(譬如1000和1001)散列后也相邻,最好连续的x之间散列后越分散越好。 2、我希望该算法很简单,即处理速度要快。
1、我希望有这样一个哈希(散列)函数,把一个dword类型的数字x平均分布到0..MaxHX区间内,但是我不希望连续的两个x(譬如1000和1001)散列后也相邻,最好连续的x之间散列后越分散越好。 2、我希望该算法很简单,即处理速度要快。
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2002-04-24 #4 >>平均分布到0..MaxHX区间内 难度比较大——除非MaxHX是2的整数次方——才稍容易一些。 >>连续的两个x... 除非你的算法很糟糕(或者运气很差),否则就不会出现这个问题。 现在有很多算法可以做到两个相差1bit的二进制数Hash之后的结果有一半的二进制位不同。 (比如32bit的结果中有16bit不同)。
>>平均分布到0..MaxHX区间内 难度比较大——除非MaxHX是2的整数次方——才稍容易一些。 >>连续的两个x... 除非你的算法很糟糕(或者运气很差),否则就不会出现这个问题。 现在有很多算法可以做到两个相差1bit的二进制数Hash之后的结果有一半的二进制位不同。 (比如32bit的结果中有16bit不同)。
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2002-06-07 #7 function HashInt(const N:Integer):Integer; var m:Integer; pb0,pb1,pb2,pb3Byte; 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) mod MaxValue 即可(0..MaxValue-1)
function HashInt(const N:Integer):Integer; var m:Integer; pb0,pb1,pb2,pb3Byte; 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) mod MaxValue 即可(0..MaxValue-1)