A. java有沒有不會沖突的hash演算法

java.util.HashMap的中put方法的具體實現:
static inline intptr_t get_next_hash(Thread * Self, oop obj) {
intptr_t value = 0 ;
if (hashCode == 0) {
// This form uses an unguarded global Park-Miller RNG,
// so it's possible for two threads to race and generate the same RNG.
// On MP system we'll have lots of RW access to a global, so the
// mechanism inces lots of coherency traffic.
value = os::random() ;
} else
if (hashCode == 1) {
// This variation has the property of being stable (idempotent)
// between STW operations. This can be useful in some of the 1-0
// synchronization schemes.
intptr_t addrBits = intptr_t(obj) >> 3 ;
value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
} else
if (hashCode == 2) {
value = 1 ; // for sensitivity testing
} else
if (hashCode == 3) {
value = ++GVars.hcSequence ;
} else
if (hashCode == 4) {
value = intptr_t(obj) ;
} else {
// Marsaglia's xor-shift scheme with thread-specific state
// This is probably the best overall implementation -- we'll
// likely make this the default in future releases.
unsigned t = Self->_hashStateX ;
t ^= (t << 11) ;
Self->_hashStateX = Self->_hashStateY ;
Self->_hashStateY = Self->_hashStateZ ;
Self->_hashStateZ = Self->_hashStateW ;
unsigned v = Self->_hashStateW ;
v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;
Self->_hashStateW = v ;
value = v ;
}

value &= markOopDesc::hash_mask;
if (value == 0) value = 0xBAD ;
assert (value != markOopDesc::no_hash, "invariant") ;
TEVENT (hashCode: GENERATE) ;
return value;
}

該實現位於hotspot/src/share/vm/runtime/synchronizer.cpp文件下。

B. Java語言中Object對象的hashCode取值的底層演算法是怎樣實現的

在JDK中看到

public native int hashCode();

這是一個本地方法,需要找源代碼才能找到

然後我在Android SDK中的JDK Object類找到了這個,應該是你想要的了

publicinthashCode(){
intlockWord=shadow$_monitor_;
finalintlockWordStateMask=0xC0000000;//Top2bits.
finalintlockWordStateHash=0x80000000;//Top2bitsarevalue2(kStateHash).
finalintlockWordHashMask=0x0FFFFFFF;//Low28bits.
if((lockWord&lockWordStateMask)==lockWordStateHash){
returnlockWord&lockWordHashMask;
}
returnSystem.identityHashCode(this);
}

但最後的System.identityHashCode(this)方法還是一個本地方法,還得去找源碼,你折騰的話自己去搜索吧。

下面是String類的hashCode()方法,可以看下

publicinthashCode(){
inth=hash;
if(h==0&&value.length>0){
charval[]=value;

for(inti=0;i<value.length;i++){
h=31*h+val[i];
}
hash=h;
}
returnh;
}

C. java中哪些地方實現了一致性hash演算法

關於一致性Hash演算法,在我之前的博文中已經有多次提到了,MemCache超詳細解讀一文中"一致性Hash演算法"部分,對於為什麼要使用一致性Hash演算法、一致性Hash演算法的演算法原理做了詳細的解讀。

演算法的具體原理這里再次貼上:

先構造一個長度為232的整數環(這個環被稱為一致性Hash環),根據節點名稱的Hash值(其分布為[0, 232-1])將伺服器節點放置在這個Hash環上,然後根據數據的Key值計算得到其Hash值(其分布也為[0, 232-1]),接著在Hash環上順時針查找距離這個Key值的Hash值最近的伺服器節點,完成Key到伺服器的映射查找。

這種演算法解決了普通余數Hash演算法伸縮性差的問題,可以保證在上線、下線伺服器的情況下盡量有多的請求命中原來路由到的伺服器。

當然,萬事不可能十全十美,一致性Hash演算法比普通的余數Hash演算法更具有伸縮性,但是同時其演算法實現也更為復雜,本文就來研究一下,如何利用Java代碼實現一致性Hash演算法。在開始之前,先對一致性Hash演算法中的幾個核心問題進行一些探究。

D. java小問題,使用哈希表儲存元素(比如說字元串),我們老師是把哈希表比作一個數組,然後通過演算法計

哈希表要佔用抄比成員數據略大的襲連續地址空間。比如你存10個數,可能需要申請20個數的地址空間a[20].
散列函數把這10個數分別散落在這20個空間中,好的散列函數生成的地址值需要沒有碰撞沖突,2個數據出現在一個地址空間的機率要最小化...

E. 怎樣比較深刻的理解Java中各種演算法結構及實現原理,例如HashMap中用到的Hash演算法

你這打擊面實在太大了 真的沒法和你說
演算法這東西本質上就是數學 想要提供演算法能力方法只有一個就是提高自己的數學能力 其他就是假的

F. java 1.哈希演算法的實現:輸出這組數據

public static void main(String[] args){
System.out.println("輸入n,按回復車:");
Scanner s = new Scanner(System.in);
Integer n = Integer.parseInt(s.next());
Integer re = factorial(1, n);
System.out.println(re);
}
public static Integer factorial(Integer a, Integer b){
if(b == 1){
return a * b;
}else{
return a * b * factorial(a, b-1);
}
}
量,制當溫度降低時,物體內能減小。所有能量的單位都是:焦耳。熱

G. Java HashMap的get(),put()演算法時間復雜度

最優情況,hash不碰撞,O(1),典型情況,近似是O(1),因為幾乎沒有碰撞,最壞情況,O(N),也就是所有的hash都一樣,那麼退化為線性查找

H. java 1.哈希演算法的實現:

public class Test { /*創建類*/

public static void main(String[] args) {
System.out.println(dg(100));
}

static int dg(int i) { /*定義變數復 */
int sum;
if (i == 1) /*假設制條件*/
return 1;
else
sum = i + dg(i - 1); /*1~100的和的表達式*/
return sum; /*返回結果*/
}
}
這個腳本語言為 Internet 應用而生,它可以看作是 Haskell 和 Java 的結合。

I. Java中單向散列函數演算法

Hash,一般翻譯做「散列」,也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。

數學表述為:h = H(M) ,其中H( )--單向散列函數,M--任意長度明文,h--固定長度散列值。

在信息安全領域中應用的Hash演算法,還需要滿足其他關鍵特性:

第一當然是單向性(one-way),從預映射,能夠簡單迅速的得到散列值,而在計算上不可能構造一個預映射,使其散列結果等於某個特定的散列值,即構造相應的M=H-1(h)不可行。這樣,散列值就能在統計上唯一的表徵輸入值,因此,密碼學上的 Hash 又被稱為"消息摘要(message digest)",就是要求能方便的將"消息"進行"摘要",但在"摘要"中無法得到比"摘要"本身更多的關於"消息"的信息。

第二是抗沖突性(collision-resistant),即在統計上無法產生2個散列值相同的預映射。給定M,計算上無法找到M',滿足H(M)=H(M') ,此謂弱抗沖突性;計算上也難以尋找一對任意的M和M',使滿足H(M)=H(M') ,此謂強抗沖突性。要求"強抗沖突性"主要是為了防範所謂"生日攻擊(birthday attack)",在一個10人的團體中,你能找到和你生日相同的人的概率是2.4%,而在同一團體中,有2人生日相同的概率是11.7%。類似的,當預映射的空間很大的情況下,演算法必須有足夠的強度來保證不能輕易找到"相同生日"的人。

第三是映射分布均勻性和差分分布均勻性,散列結果中,為 0 的 bit 和為 1 的 bit ,其總數應該大致相等;輸入中一個 bit 的變化,散列結果中將有一半以上的 bit 改變,這又叫做"雪崩效應(avalanche effect)";要實現使散列結果中出現 1bit 的變化,則輸入中至少有一半以上的 bit 必須發生變化。其實質是必須使輸入中每一個 bit 的信息,盡量均勻的反映到輸出的每一個 bit 上去;輸出中的每一個 bit,都是輸入中盡可能多 bit 的信息一起作用的結果。

J. Java hashMap合並演算法

用Kotlin語言寫了一下,Java只要把MutableMap改成Map就可以了

importkotlin.random.Random;
funmain(arg:Array<String>){
println("HelloWorld");
valmap:Map<String,String>=hashMapOf(
"1242"to"A31_001","2424"to"A31_001",
"3646"to"A31_002");
println("原map:$map");
valgroups:HashMap<String,MutableMap<String,String>>=hashMapOf();
for((k,v)inmap.entries){
if(!groups.containsKey(v))groups.put(v,hashMapOf());
valm=groups.getValue(v);
m.put(k,v);
}
println("重組新map:$groups");
//給換成新隨機id,沒必要但為滿足要求
valnewMap:HashMap<Int,MutableMap<String,String>>=hashMapOf();
varid:Int;
for(vingroups.values){
do{id=Random.nextInt();}
while(newMap.containsKey(id));
newMap.put(id,v);
}
println("新隨機生成ID:$newMap");
}
html">
>Task:run
HelloWorld
原map:{1242=A31_001,3646=A31_002,2424=A31_001}
重組新map:{A31_002={3646=A31_002},A31_001={2424=A31_001,1242=A31_001}}
新隨機生成ID:{-91779881={2424=A31_001,1242=A31_001},2102779363={3646=A31_002}}

BUILDSUCCESSFULin0s