2011-10-11 72 views
1

所以我一直在尋找的散列函數,並推斷出,鑑於2個類似的字符串,即使由一個位不同,其結果將是一個完全不同的哈希鍵。實際上我需要創建一些獨特的id,它具有類似輸入的相似特徵(將會有數百萬個字母數字字符串)。我需要給予類似的輸入函數返回類似指標

實施例:

  • 兩個相等的字符串必須具有相同的哈希值。
  • 兩個不同的字符串必須有不同的散列。
  • 兩個不同的字符串,非常相似,必須有不同的哈希值,同時不會太遠。

這將是實現一個好的方法嗎?我正在使用python。

+1

」兩個不同的字符串必須有不同的散列。「除非哈希值超過最長的字符串,否則這是不可能的。 「兩個不同的字符串,非常相似,必須有不同的哈希值,同時彼此距離不太遠。」如果你不需要加密安全性,你可以使用一些散列函數的簡化版本。 – agf

+4

使用字符串raw和存儲某種形式的levenstein距離? –

+0

你能解釋一下你想要做什麼嗎?可能有更好的方法來實現你的最終結果。 – beerbajay

回答

0

如果您確定始終使用字母數字數據,則建議使用基本36(或更高)算法。

你可以用我給的回答爲這個問題的方法:Base 62 conversion

import string 
BASE_LIST = string.digits + string.letters 
BASE_DICT = dict((c, i) for i, c in enumerate(BASE_LIST)) 

def base_decode(string, reverse_base=BASE_DICT): 
    length = len(reverse_base) 
    ret = 0 
    for i, c in enumerate(string[::-1]): 
     ret += (length ** i) * reverse_base[c] 

    return ret 

def base_encode(integer, base=BASE_LIST): 
    length = len(base) 
    ret = '' 
    while integer != 0: 
     ret = base[integer % length] + ret 
     integer /= length 

    return ret 

用法示例:

for i in range(100):          
    print i, base_decode(base_encode(i)), base_encode(i) 
0

我相信下面的滿足你們所要求的。

def gethash(data): 
    u"given a character string return an integer hash value" 
    return reduce(lambda b1, b2: (b1 << 8) + b2, 
     imap(ord, unicodedata.normalize('NFC', data).encode('UTF-8'))) 

本質上,散列值是輸入的UTF-8編碼字節值的完整二進制值作爲單個整數。類似的字符串產生具有相似位的散列值(並不總是具有小的差異差異,但是您沒有指定)。規範化會導致字符串u'A\u030a'u'\xc5'具有相同的散列值。

如果你想限制的最大值,那麼只需在最後一步應用模除法(2^32可能)。

1

你所要求的是不可能的,假設用'類似的散列'表示值應該具有相似的大小 - 例如,12345與12346類似,但不是92345。原因是相似度(一條數字線),但是字符串可以彼此相似的方式沒有固定的維度(例如'foo','fob'和'fod'都相距1) 。

如果要執行模糊匹配,則需要使用另一種索引文本的方法,如thisthis

如果您只是想比較各個值的相似性,請不要將它們散列在第一位 - 只需立即計算它們的編輯距離即可。 「