所以我一直在寻找的散列函数,并推断出,鉴于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