所以我一直在尋找的散列函數,並推斷出,鑑於2個類似的字符串,即使由一個位不同,其結果將是一個完全不同的哈希鍵。實際上我需要創建一些獨特的id,它具有類似輸入的相似特徵(將會有數百萬個字母數字字符串)。我需要給予類似的輸入函數返回類似指標
實施例:
- 兩個相等的字符串必須具有相同的哈希值。
- 兩個不同的字符串必須有不同的散列。
- 兩個不同的字符串,非常相似,必須有不同的哈希值,同時不會太遠。
這將是實現一個好的方法嗎?我正在使用python。
所以我一直在尋找的散列函數,並推斷出,鑑於2個類似的字符串,即使由一個位不同,其結果將是一個完全不同的哈希鍵。實際上我需要創建一些獨特的id,它具有類似輸入的相似特徵(將會有數百萬個字母數字字符串)。我需要給予類似的輸入函數返回類似指標
實施例:
這將是實現一個好的方法嗎?我正在使用python。
如果您確定始終使用字母數字數據,則建議使用基本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)
我相信下面的滿足你們所要求的。
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可能)。
」兩個不同的字符串必須有不同的散列。「除非哈希值超過最長的字符串,否則這是不可能的。 「兩個不同的字符串,非常相似,必須有不同的哈希值,同時彼此距離不太遠。」如果你不需要加密安全性,你可以使用一些散列函數的簡化版本。 – agf
使用字符串raw和存儲某種形式的levenstein距離? –
你能解釋一下你想要做什麼嗎?可能有更好的方法來實現你的最終結果。 – beerbajay