高分求一个hashcode算法!!高分求!!急!

zzchunye 2009-10-10 02:08:15
求一个hashcode算法,要求将任意长度字符串,转化成一个 64位长度的二进制hash码!请高手尽量用java语言实现!!
多谢!!
...全文
284 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
whywen_MoJian 2009-10-17
  • 打赏
  • 举报
回复
mark
withoutme_hw 2009-10-15
  • 打赏
  • 举报
回复
Long.toBinaryString(long i);



[Quote=引用 8 楼 zzchunye 的回复:]
Long 显示的不是二进制的啊~~~~ 麻烦能给个返回时64位 二进制的hash算法。。多谢!!! 类似与这样的(01011010010110100101101001011010)
[/Quote]
xingzhe2001 2009-10-14
  • 打赏
  • 举报
回复
void hash(unsigned char *str, unsigned long out[64] ) 
{
unsigned long hash = 5381;
int c;

while (c = *str++)
hash = ((hash < < 5) + hash) + c; /* hash * 33 + c */

hash;
for( int i = 63; i >=0; i-- )
out[63-i] = (hash>>i)&0x1;
}

out里面就是64个1/0
24K純帥 2009-10-14
  • 打赏
  • 举报
回复
zzchunye 2009-10-12
  • 打赏
  • 举报
回复
可以是int[64]的 多谢 !也可以是纯字符串的!
xingzhe2001 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xingzhe2001 的回复:]
你这个64位二进制串打算保存在什么地方?char[64]? int[64]? bool[64]还是什么?
[/Quote]
是问楼主的
xingzhe2001 2009-10-12
  • 打赏
  • 举报
回复
你这个64位二进制串打算保存在什么地方?char[64]? int[64]? bool[64]还是什么?
showjim 2009-10-12
  • 打赏
  • 举报
回复
private static int _hashCode(this byte[] oldValue)
{
//一般编码都以字节为基本单位,也就是说基本单位长度为8bit;
//常用编码可能比较集中,造成编码中出现伪固定位(大多时候某些固定位都是同一值)
//采用移位的方式:当移位量为1或7时,一般只能覆盖掉1个固定位;当移位量为3或5时,一般能覆盖掉3个固定位;所以本程序使用的移位量为8x+5/3
//由于64=5+59=13+3*17=3*7+43=29+5*7=37+3*3*3=5*9+19=53+11=61+3,其中(5+59),(53+11),(61+3)为素数对成为最佳移位量,本程序选择中性素数对53+11
//由于32=5+3*3*3=13+19=3*7+11=29+3,其中(13+19),(29+3)为素数对成为最佳移位量,本程序选择中性素数对13+19
ulong code = 0;
int length = oldValue.Length, end = length & 7;
for (int i = (length >> 3) - 1; i >= 0; i--) code = ((code ^= BitConverter.ToUInt64(oldValue, i << 3)) << 53) + (code >> 11);
if (length > 7) code = ((code << 19) + ((code & 0xffff) >> 13)) ^ (code >> 32);
if (end >= 4)
{
code = ((code ^= (ulong)BitConverter.ToUInt32(oldValue, length)) << 19) + (code >> 13);
length += 4;
end -= 4;
}
if (end != 0)
{
ulong bytes = (ulong)oldValue[length];
switch (end)
{
case 1:
code = ((code ^= (bytes << 24) + (bytes << 16) + (bytes << 8) + bytes) << 19) + (code >> 13);
break;
case 2:
code = ((code ^= ((bytes += (ulong)oldValue[length + 1] << 8) << 16) + bytes) << 19) + (code >> 13);
break;
case 3:
ulong middle = ((ulong)oldValue[length + 1] << 8) + ((ulong)oldValue[length + 2] << 16);
code = ((code ^= (bytes + middle) ^ (middle << 7)) << 19) + (code >> 13);
break;
}
}
return (int)(code & 0x7fffffff);
}
}
zzchunye 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xingzhe2001 的回复:]
引用 11 楼 zzchunye 的回复:
不好意思,java中 long所表现的形式是一堆10进制的数,所以我就觉的它应该是10进制的吧~ 我的最终要求就是我所说的返回值类似与这样的(01011010010110100101101001011010)是64位长度的!! 如果long值可以转化成我所期望的64位 二进制的话 也是可以满足我的要求的。 如果有什么说错的,请见谅!


10进制,16进制,8进制等等是人的理解,是你在调试器里看到的数字,在计算机里都是二进制。默认调试输出成10进制,如果你选择hex回输出16进制,有的调试器可以选择binary就当成2进制看。但你要明白这是给人看的,在计算机里并没哟变化,都是个2进制的数. 也就是说比如有个数17,那么这个数不论采用什么进制
0x11,021,0b10001,17都是表示的17,在机器里都是0b10001
[/Quote]

多谢,我知道楼上的意思,计算机里都是二进制的。。但是我的需求就是能够返回这样的(01011010010110100101101001011010)是64位长度的!! 的二进制hashcode~~ 就是二进制显示形式的。。 呵呵 可能是我开始没说清楚吧~~ 那位高人能够帮我解决这个问题!!多谢!
xingzhe2001 2009-10-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zzchunye 的回复:]
不好意思,java中 long所表现的形式是一堆10进制的数,所以我就觉的它应该是10进制的吧~ 我的最终要求就是我所说的返回值类似与这样的(01011010010110100101101001011010)是64位长度的!! 如果long值可以转化成我所期望的64位 二进制的话 也是可以满足我的要求的。 如果有什么说错的,请见谅!
[/Quote]

10进制,16进制,8进制等等是人的理解,是你在调试器里看到的数字,在计算机里都是二进制。默认调试输出成10进制,如果你选择hex回输出16进制,有的调试器可以选择binary就当成2进制看。但你要明白这是给人看的,在计算机里并没哟变化,都是个2进制的数. 也就是说比如有个数17,那么这个数不论采用什么进制
0x11,021,0b10001,17都是表示的17,在机器里都是0b10001
zzchunye 2009-10-11
  • 打赏
  • 举报
回复
自己顶!!!
zzchunye 2009-10-10
  • 打赏
  • 举报
回复
不好意思,java中 long所表现的形式是一堆10进制的数,所以我就觉的它应该是10进制的吧~ 我的最终要求就是我所说的返回值类似与这样的(01011010010110100101101001011010)是64位长度的!! 如果long值可以转化成我所期望的64位 二进制的话 也是可以满足我的要求的。 如果有什么说错的,请见谅!
xingzhe2001 2009-10-10
  • 打赏
  • 举报
回复
long怎么不是二进制???? 那是什么?
zzchunye 2009-10-10
  • 打赏
  • 举报
回复
Long 显示的不是二进制的啊~~~~ 麻烦能给个返回时64位 二进制的hash算法。。多谢!!! 类似与这样的(01011010010110100101101001011010)
xingzhe2001 2009-10-10
  • 打赏
  • 举报
回复

不熟悉java,但是听说java的long是64位的
zzchunye 2009-10-10
  • 打赏
  • 举报
回复
请问这个返回后是 二进制的hash码吗? 我要求的是64位的二进制类似 0101010101001010101010100101
这样的。。。。
xingzhe2001 2009-10-10
  • 打赏
  • 举报
回复
这么详细了还要啥
unsigned long hash(unsigned char *str) 
{
unsigned long hash = 5381;
int c;

while (c = *str++)
hash = ((hash < < 5) + hash) + c; /* hash * 33 + c */

return hash;
}


算法很简单阿,你看每次把hash这个变量左移5位和hash+str[i]相加,你用的时候就是

unsigned long h = hash("hello world");
这个h就是算出来的hash值
zzchunye 2009-10-10
  • 打赏
  • 举报
回复
小弟对算法不是很懂,能否给个详细的说明代码,多谢了!!
xingzhe2001 2009-10-10
  • 打赏
  • 举报
回复
xingzhe2001 2009-10-10
  • 打赏
  • 举报
回复
unsigned long 
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;

while (c = *str++)
hash = ((hash < < 5) + hash) + c; /* hash * 33 + c */

return hash;
}

加载更多回复(1)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧