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的哈希值相同。