2011-10-11 69 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

如果您只是想比较各个值的相似性,请不要将它们散列在第一位 - 只需立即计算它们的编辑距离即可。 “