java哈希
㈠ java中hash函数都有什么用啊
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
了解了hash基本定义,就不能不提到一些着名的hash算法,MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢?
这里简单说一下:
1) MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。
2) MD5
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
3) SHA1 及其他
SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
㈡ java中什么是哈希码值
哈希码是一种数据结构的算法。常见的哈希码的算法有:
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new
Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
㈢ java:哈希表的原理与用法
Hashtable,原理嘛就不知道了。只知道说其是提供了两个集合之间映射的能力,并且拥有每个元素的查询时间近乎恒定的特性。两个集合之间映射的能力,简单的说,就是像是存放系统属性的Properties类一样(该类继承自Hashtable),Properties类中将String映射到String,你可以用setProperty(String key, String value)把一对值对(key,value)存入Properties中,用getProperty(String key) 取得key对应的value值。用System.getProperties()你可以获得一个系统属性的哈希表,直接println出来你就可以看到整个哈希表所构成的集合了。第一个元素应该是java.runtime.name=Java(TM) SE Runtime Environment这个。这里你可以看得出"java.runtime.name"被映射到了"Java(TM) SE Runtime Environment"。在这里你也可以调用System.getProperties().getProperty("java.runtime.name")得到字符串"Java(TM) SE Runtime Environment"。这就是哈希表所提供的功能了,将一个元素映射到另一个元素,这之间的映射所构成的集合就是哈希表了。
你可以自己看看API文档,里面有详细的解说,不过嘛,嘿嘿,中文版的那个翻译啊,哎,惨不忍睹啊,感触最多的是——主谓宾都难找啊。
㈣ 关于java的哈希值
看看JDK API文档,记得里面有例子的
HashMap 或 HashTable
㈤ JAVA中哈希码具体是什么
哈希其实只是一个概念,没有什么真实的指向。它的目的是保证数据均匀的分布到一定的范围内。所以不同数据产生相同的哈希码是完全可以的。
java中哈希一般是希望自己写算法的。随便返回什么都可以。如果什么也不写的话就会返回地址。如果自己写,最简单的做法是把所有字段拼起一个长串做个hash值。
㈥ JAVA的哈希码
不是只要是同一个引用,比如Cat cat3=cat1;那么cat3和cat1的引用是同一个他们的hash码就是一样的,new了之后就是不一样的对象引用,他们的hash码当然不一样了
㈦ 关于java的哈希值
HASH
是散列表的基础计算方法,Java
内置了
hash
的支持,java.lang.Object
默认是通过对象在内存的地址计算出来的,所以每个对方都是唯一的
hash,但是当我们创建我们自己的对象类时,我们根据需要和业务逻辑来决定是否提供自己的
hashcode
和
equals
方法。
多个对象的
hash
可能重复,这是正常的,重复的对象在
hash
table
中是分配在同一个槽
(一个可以通过计算直接跳过那个位置的数组)中,会再通过
equals
对比
(在这个槽中的
hash
code
都相同的一个链表中逐一
equals
比较
key)
找到那个对象。
所以逻辑上是否相同是通过
equals
来计算的,而且
equals
相同的两个对象,它们的
hash
也应该相同,如果你不能保证这点,那就说明你的
hashcode
和
equals
方法不是使用相同的算法。
一个对象是否存在不是通过
hash
code
来判断的,而是
equals。
a
==
b
的话,a.equals
(b)
肯定成立,但反过来就不一定。因为
a
==
b
比较的是对象的地址,只有同一个对象才能成立,equals
比较的是逻辑角度上的相等性。
看
String
或其它一个
JRE
自带的类的
hashcode
和
equals
方法是怎么做到的。
㈧ java哈希值
两个内容相同的对象具有相同的hashcode;反之不成立。
HashMap对象是根据其Key的hashCode来获取对应的Value。
map的实现是数组结合链表。hashcode决定存放位置,两个对象位置一样时比较equals方法。true的话覆盖(同一个对象),false的添加(不是同一个对象)。
㈨ java中如何实现哈希映射
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Set;
classStudent
{
Stringname;
intage;
publicStudent(Stringname,intage)
{
this.name=name;
this.age=age;
}
}
publicclassHashMapTest
{
publicstaticvoidmain(String[]args)
{
HashMaphm=newHashMap();
Students1=newStudent("Tom",21);
Students2=newStudent("Jerry",25);
Students3=newStudent("Lee",22);
Students4=newStudent("Lily",29);
hm.put("Tom",s1);
hm.put("Jerry",s2);
hm.put("Lee",s3);
hm.put("Lily",s4);
Students=(Student)hm.get("Tom");
System.out.println("学生对象的名称为:"+s.name);
SetkeySet=hm.keySet();
Iteratoritr=keySet.iterator();
while(itr.hasNext())
{
Stringkeys=(String)itr.next();
Studentss=(Student)hm.get(keys);
System.out.println("迭代输出学生对象的名称为;"+ss.name+"年龄为:"+ss.age);
}
}
}
㈩ 关于Java中的对象的哈希值何时相等
1.标准的基本类型只要值相等,哈希值就相同;
Integer a=10;
Integer b=10;
那么a和b的哈希值就相同。类似的还有Short、Long、Byte、Boolean、String等等
2.同一个对象,与何时运行该程序无关;
哈希值算法中,对象的内存地址不参与运算。因此只要是同一个对象,那么该对象的哈希值就不会改变。
3.关于容器的哈希值
java中常用的容器有List、Map、Set。那么它们的哈希值又有什么特点呢?
假设有如下两个List:
List<String> list1= new ArrayList<String>();
list1.add("item1");
list1.add("item2");
List<String> list2= new ArrayList<String>();
list2.add("item2");
list2.add("item1");
这两个List的哈希值是不一样的。对于List来讲,每一个元素都有它的顺序。如果被添加的顺序不同,最后的哈希值必然不同。
假如有如下两个Map:
Map<String, String> map1= new HashMap<String, String>();
map1.put("a", "1");
map1.put("b", "2");
map1.put("c", "3");
Map<String, String> map2= new HashMap<String, String>();
map2.put("b", "2");
map2.put("a", "1");
map2.put("c", "3");
这两个Map虽然元素添加的顺序不一样,但是每一个元素的Key-Value值一样。Map是一种无序的存储结构,因此它的哈希值与元素添加顺序无关,这两个Map的哈希值相同。
假如有如下两个Set:
Set<String> set1= new HashSet<String>();
set1.add("a");
set1.add("b");
set1.add("c");
Set<String> set2= new HashSet<String>();
set2.add("b");
set2.add("a");
set2.add("c");
类似的,由于Set也是一种无序的存储结构,两个Set虽然添加元素的顺序不一样,但是总体来说元素的个数和内容是一样的。因此这两个Set的哈希值也相同。
其实,Set的实现是基于Map的。我们可以看到,如果将Set中的元素当做Map中的Key,把Map中的value始终设置为null,那么它就变成了一个Set。
Set<String> set1= new HashSet<String>();
set1.add("a");
set1.add("b");
set1.add("c");
Map<String, String> map1= new HashMap<String, String>();
map1.put("a", null);
map1.put("b", null);
map1.put("c", null);
通过实验我最后得到了印证,set1与map1的哈希值相同。