2013-12-10 25 views
0

我有這個,我想使它更有效率,如果你需要我創建的整個哈希集數據結構,我可以添加它,但即時通訊整體尋找這樣的東西這發生在我的自定義實現一個HashSet的任何數量的字符串,並將它們存儲:需要在java中更好的實現這個FNV哈希算法

private int hash(String key) 
{ 
    int prime = 31; 
    int hash = 0; 

    for(int i = 0; i < key.length(); i++) 
    { 
     hash *= prime; 
     hash ^= key.charAt(i); 
    } 

    if (hash < 0) 
     hash *= -1; 

    return hash % array.length; 
} 
+0

如果你想爲一個字符串數組生成哈希碼,我們已經建立了像'Arrays.hashCode(Object [])':'Arrays.hashCode(strArray)'這樣的函數。簡單而高效 – Sage

+0

對不起,我沒有說,沒有使用的Java API,我必須逐字添加 – user3080111

+0

請讓它更清楚一點。你將一個String傳遞給哈希函數,但是返回語句有'array.length':這個數組來自哪裏? – Sage

回答

0

幾個意見:

  • 它是普遍接受的這些天,33是黃金的一個更好的選擇,而不是31,因爲這會導致大多數非英語語言中的衝突更少(英語與大約相同的語言無論哪種方式,都會有數量的碰撞)。
  • 你的字符串轉換爲字符數組以及訪問的方式,而不是調用的charAt()多次很可能是元素更快
  • 下面的代碼是無效的:

    if (hash < 0) 
        hash *= -1; 
    

    此代碼是更好的,因爲(1)它不使用處理器乘法指令,其是資源密集的,並且(2)也不會產生轉移誤預測週期性:

    hash &= ~0x80000000;