代码之家  ›  专栏  ›  技术社区  ›  Robert O'Brien

基于模式数据创建一个唯一且防止重复的id

  •  0
  • Robert O'Brien  · 技术社区  · 6 年前

    所以我插入的数据看起来像这样。。在我的mongodb集合中,有一些轮询数据

    Link to sample insertions

    我计划将“Poll_Name”、“Date”、“Sample_Size”和“MoE”值组合成一个唯一的字符串,然后使用一些函数将其转换为唯一的id值。

    我希望从这个函数中获得的是为每个轮询创建一个id的能力,以及在给定重复字符串的情况下创建一个重复id的能力。

    例如,假设我想将此民意调查添加到我的数据库中。。

    {'Poll_Name': 'NBC News/Marist', 'Date': '2020-03-10', 'Sample_Size': '2523 RV', 'MoE': '2.7', 'Biden (D)': '47', 'Trump(R)': '46', 'Spread': 'Biden +1'}
    

    我使用此轮询的“poll_Name”、“Date”、“Sample_Size”和“MoE”值创建一个id

    所以绳子会像这样出来。。。

    poll_String = "NBC News/Marist2020-03-102523RV2.7"
    

    然后我把它放到创建id的函数中,假设它输出值“12345”(为了简单起见) 然后,让我们在后面的插入中说,我添加了一个与此轮询完全相同的副本,因此“poll_String”与此轮询副本的结果完全相同。

    我需要id创建函数返回完全相同的值,即12345,这样我就知道这里添加的轮询是重复的。显然,在这个过程中,要确保创建的id对其他不同的轮询完全唯一,以免创建不正确的重复id。

    这可能吗?或者我要求的东西太先进了。。。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Gur Telem    6 年前

    您可以使用哈希函数来创建数据的哈希值。 但你需要考虑到,哈希数据并不能保证另一段数据不会有相同的哈希,这是非常不可能的。 因此,请考虑以下代码

    
    import hashlib
    some_string = "Some test string I want to generate an ID from"
    new_id = hashlib.md5(some_string.encode()).hexdigest()
    print(new_id)
    

    此片段将打印 051ba4078ab8419b76388ee9173dac1a . 请注意md5哈希 should not be used to store passwords .

    此外,如果你想让id比这个短,你可以简单地取第一个 x 哈希的字符。但请记住,id越短,获得具有相同自动生成id的两条数据的可能性就越高。

    使用此方法,两个不同数据块具有相同自动生成id的几率大约为1/16^x。考虑一下你有多少数据,以及你希望id冲突发生的可能性有多小。在我看来,在应用程序的生命周期内超过99%是合理的。 因此,如果你有1亿个项目,从md5哈希中提取前10个十六进制字符将使你有大约0.01%的可能性发生冲突(当然,假设没有相同的项目)。

    此外,它不是随机的,所以对于同一个字符串,你总是会得到相同的哈希值。