簡體   English   中英

為LSH Minhash算法生成隨機哈希函數

[英]Generating Random Hash Functions for LSH Minhash Algorithm

我正在用Java編寫一個minhashing算法,它要求我生成任意數量的隨機散列函數(在我的情況下為240個散列函數),並通過它運行任意數量的整數(目前為2000)。

為了做到這一點,我一直在為240個散列函數中的每一個生成隨機數a,b和c(從1到2001的范圍)。 然后,我的哈希函數返回h =((a * x)+ b)%c,其中h是返回值,x是通過它運行的整數之一。

這是隨機散列的有效實現,還是有更常見/可接受的方式來實現它?

這篇文章提出了類似的問題,但我仍然對答案的措辭感到困惑: Minhash實現如何為排列找到哈希函數

幾年前,當我使用Bloom過濾器時,我遇到了一篇文章,該文章描述了如何使用最少的代碼非常簡單地生成多個哈希函數。 他描述的方法非常有效。 請參閱更少哈希,相同性能:構建更好的布隆過濾器

基本思想是創建兩個哈希函數,稱之為h1h2 ,然后使用以下公式模擬多個哈希函數g1gk

gi = h1(x) + i*h2(x)

i從1到k (你想要的散列函數的數量)變化。

即使你決定不實施他的想法,這篇論文也值得一讀。 雖然在閱讀之后我無法想象不想實現它。 它使我的Bloom過濾器代碼更易於處理,並且不會對性能產生負面影響。

所以我上面描述的方法幾乎是正確的。 數字a和b應隨機生成。 但是,c需要是一個略大於x的最大可能值的素數。 一旦選擇了這些數字,使用h =((a * x)+ b)%c找到散列值h是生成散列函數的標准,可接受的方式。

此外,a和b應該是1到c-1范圍內的隨機數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM