2010-10-25 86 views
2

我正在尋找一個散列函數,它將任何整數作爲輸入(正數或負數,但如果這可以使它更容易受限於int範圍),以及返回一個介於-1和1之間的實數。是否有這樣一個函數,或者從另一個哈希函數中構建它的任何顯而易見的方法?返回-1和1之間的值的散列函數

該功能不一定非常安全,只要它具有足夠的「隨機性」即可。如果存在C/C++實現,則爲獎勵積分。

回答

5
  1. 挑選爲整數任何哈希函數,如boost::hash
  2. 正常化的結果爲2通過由整數
  3. 減1.

的最大值的一半除以

這裏是一個快速入門示範:

#include<stdio.h> 

double inthash(unsigned int key) 
{ 
    key += (key << 12); 
    key ^= (key >> 22); 
    key += (key << 4); 
    key ^= (key >> 9); 
    key += (key << 10); 
    key ^= (key >> 2); 
    key += (key << 7); 
    key ^= (key >> 12); 
    return key/2147483647.5 - 1; 
} 

void main() 
{ 
    printf("%f\n", inthash(1)); 
    printf("%f\n", inthash(2)); 
    printf("%f\n", inthash(3)); 
    printf("%f\n", inthash(10000)); 
    printf("%f\n", inthash(10001)); 
} 

輸出:

0.368240 
-0.263032 
-0.892034 
-0.428394 
-0.150713 
3

你是什麼意思足夠「隨機」?
你總是可以劃分你整的最大int值,並得到-1之間的值1

編輯:

正常化之前,你可以這樣做

num = num^397; 

,然後除以int max。

+0

通過隨機我的意思是函數的輸出應該看起來像一串隨機數,或者類似的輸入不應該產生類似的輸出或任何其他合理的隨機性定義。 – Benno 2010-10-25 14:05:26

+0

你可以將你的號碼提升到某個素數的能力,然後根據上面的規範化它,它會更「隨機」。 – 2010-10-25 14:21:44

0

沒有什麼比這更簡單。適用於任何非負數。只需稍作修改,也可以支持負整數。

double hash(int val) 
{ 
    return val/((double)INT_MAX/2.0) - 1.0; 
} 

編輯:這應該爲所有的數字(正面和負面的)工作:

double hash(int val) 
{ 
    return val/(double)INT_MAX; 
} 

是的,這是微不足道的,因爲它看起來(這將是更準確的,如果你使用-INT_MIN爲負數)。

+0

我認爲這與Itay的答案有相同的錯誤,即輸入的結構被完全保留(類似的輸入給出類似的輸出),所以它不是「隨機的」就足夠了。 – Benno 2010-10-25 14:14:20

0

代碼片段 double hash(int val) { return val/(double)INT_MAX; } 有問題,因爲INT_MIN是-2147483648而INT_MAX是2147483647,所以INT_MIN/INT_MAX < -1。