Python 我需要一个给定相似输入返回相似索引的函数

Python 我需要一个给定相似输入返回相似索引的函数,python,hash,indexing,Python,Hash,Indexing,所以我研究了散列函数,发现给定两个类似的字符串,即使它们相差一位,结果也会是一个完全不同的散列键。实际上,我需要创建某种唯一的id,它具有这样的特性:对于类似的输入(将是数百万个字母数字字符串),它非常相似 例如: 两个相等的字符串必须具有相同的哈希 两个不同的字符串必须具有不同的哈希 两个非常相似的不同字符串必须具有不同的哈希值,同时它们之间的距离不会太远 实现这一目标的好方法是什么?我使用的是python。如果您确信您总是有字母数字数据,那么我建议使用base 36(或更高)算法 你可以

所以我研究了散列函数,发现给定两个类似的字符串,即使它们相差一位,结果也会是一个完全不同的散列键。实际上,我需要创建某种唯一的id,它具有这样的特性:对于类似的输入(将是数百万个字母数字字符串),它非常相似

例如:

  • 两个相等的字符串必须具有相同的哈希

  • 两个不同的字符串必须具有不同的哈希
  • 两个非常相似的不同字符串必须具有不同的哈希值,同时它们之间的距离不会太远

实现这一目标的好方法是什么?我使用的是python。

如果您确信您总是有字母数字数据,那么我建议使用base 36(或更高)算法

你可以用我给出的方法来回答这个问题:

用法示例:

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

如果你确定你总是有字母数字数据,那么我建议你使用36进制(或更高)算法

你可以用我给出的方法来回答这个问题:

用法示例:

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')))
def gethash(数据):
u“给定字符串返回整数哈希值”

返回减少(λb1,b2:(b1我相信以下内容满足您所述的要求

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')))
def gethash(数据):
u“给定字符串返回整数哈希值”

return reduce(lambda b1,b2:(b1你所要求的是不可能的,假设“相似散列”你的意思是值应该具有相似的大小-例如,12345与12346相似,但与92345不同。原因是这种相似性是一维的(一条数字线),但字符串彼此相似的方式没有固定的维度(例如,“foo”、“fob”和“fod”彼此之间都有距离1)

如果要执行模糊匹配,则需要使用不同的文本索引方法,如或


如果您只是想比较单个值的相似性,那么首先不要对它们进行散列,只需立即计算它们的编辑距离。

您所要求的是不可能的,假设“相似散列”的意思是这些值应该具有相似的大小-例如,12345与12346相似,但与92345不同。原因是这种相似性是一维的(一条数字线),但是字符串之间相似的方式没有固定的维度(例如,“foo”、“fob”和“fod”彼此之间的距离都是1)

如果要执行模糊匹配,则需要使用不同的文本索引方法,如或


如果您只是想比较单个值的相似性,首先不要对它们进行散列,只要立即计算它们的编辑距离即可。

“两个不同的字符串必须具有不同的散列。”除非散列长度超过可能的最长字符串,否则这是不可能的。“两个非常相似的不同字符串必须具有不同的哈希值,同时它们之间的距离不会太远。"如果你不需要加密安全性,你可以使用一些简化的哈希函数。使用原始字符串并存储某种形式的levenstein距离?你能解释一下你想用它做什么吗?可能有更好的方法来实现你的最终结果。我不需要加密安全性。当我说它们一定不同时,我的意思是尽可能避免冲突。我需要比较非齐次数据(数字和字符串组合),这可能会出现错误,例如键入错误“两个不同的字符串必须具有不同的哈希值”。除非哈希值长于可能最长的字符串,否则这是不可能的。“两个非常相似的不同字符串必须具有不同的哈希值,同时它们之间的距离不会太远。"如果你不需要加密安全性,你可以使用一些简化的哈希函数。使用原始字符串并存储某种形式的levenstein距离?你能解释一下你想用它做什么吗?可能有更好的方法来实现你的最终结果。我不需要加密安全性。当我说它们一定不同时,我的意思是尽可能避免冲突。我需要比较非齐次数据(数字和字符串的组合),这些数据可能会出现错误,例如键入错误