【问题标题】:What is this mapping of strings to other strings called?这种字符串到其他字符串的映射叫什么?
【发布时间】:2017-12-05 13:36:27
【问题描述】:

我正在使用一个数据集,其中包含需要公开发布的字符串形式的名称,但原始名称不可见(即我需要能够区分不同的名称,但最终结果需要具有类似“e7fx8yuo”,其中原始数据集包含“John Doe”)。

这个方法的要求听起来和散列的过程类似,但是要求更少(即我不需要变长名称映射到单个长度的散列),但是名称需要映射到一个唯一的字符串(两个不同的名称不能映射到相同的字符串)。

我打算用 python 写这个,但我不完全确定我想要实现的过程被称为什么。如果可能的话,我还希望“散列”最终产品字符串的行为类似于 github 生成存储库名称建议的方式(“reimagined-memory”而不是“e7fx8yuo”,因为一串完整的单词更容易记住也更容易记住)。 python中是否有任何模块可以为我做到这一点?

【问题讨论】:

标签: python string hash


【解决方案1】:

正如我在评论中所说,这听起来像是数据屏蔽。这是一个基本的实现:

from collections import defaultdict
from string import ascii_lowercase
from random import choice

random_strings = set()

def random_string():
    while True:
        result = ''.join(choice(ascii_lowercase) for _ in range(8))
        if result not in random_strings:
            random_strings.add(result)
            return result

masks = defaultdict(random_string)

print(masks['Adam'])
print(masks['Adam'])
print(masks['Bob'])

输出:

qmmwavuk
qmmwavuk
ykzlvfaf

【讨论】:

  • 这对我来说效果很好,唯一的问题是如果名称与输出字符串的长度(8 个字符)相比相对较长,我有时会发生冲突。是否有明确的规则规定输出字符串必须与字符串的最大长度进行比较以避免冲突?
  • @BruceJohnJennerLawso 我不知道你在说什么。代码被设计为不允许冲突(至少在最终结果中不会),并且代码与名称的长度无关。
  • 它在应用于非常大的数据集时会发生一些冲突。运行this script 会产生碰撞,例如:u'Sherrie Andrew' -> 'hjoczvn' -> u'hardcopyJamsOvertimeConjunctionsZipVendorsNecks' 与u'Jada Nevaeh' -> 'hjoczvn' -> u'hardcopyJamsOvertimeConjunctionsZipVendorsNecks' 碰撞
  • @BruceJohnJennerLawso 我现在看到我忘记了一行:random_strings.add(result)。这会强制执行唯一性。如果键的长度为 6,即 26^6 > 3 亿个唯一键,那么还有很多事情要做。
  • 是的,它要快得多。
【解决方案2】:

这是一件又快又脏的事情

导入字符串 随机导入 def id_generator(size=6, chars=string.ascii_uppercase + string.digits): return ''.join(random.choice(chars) for _ in range(size)) #如果没有传递给这个函数的参数,它将返回一个由字母和数字组成的6个字符的字符串 def makeID(名称): 名称字典 = {} 对于我的名字: var = id_generator() while var in nameDict: #如果生成器结果已经作为键存在,我们循环直到我们得到一个唯一的 var = id_generator() nameDict[var] = i #这里我们将键设置为生成器结果,并将值设置为列表中的当前名称,在本例中为“i” 打印(名称字典,) makeID(['John Doe','Jane NoDoe', 'Getsum MoDoe'])

输出:

{'H8WIAP': 'John Doe', '4NT7JC': 'Jane NoDoe', '208DBM': 'Getsum MoDoe'}

随机生成器来自Random string generation with upper case letters and digits in Python

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多