根据模式数据创建一个既唯一又能防止重复的id。

问题描述 投票:0回答:1

所以我在我的Mongo数据库中插入了类似这样的数据,这是一些投票数据。

链接到样本插入

我打算把 "Poll_Name"、"Date"、"Sample_Size "和 "MoE "的值组合成一个唯一的字符串,然后用一些函数把它转换成一个唯一的ID值。

我希望从这个函数中得到的是,既能为每个投票创建一个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。

这可能吗,还是我的要求太高了?

python database mongodb id
1个回答
1
投票

你可以使用哈希函数来创建一个数据的哈希值.但是你需要考虑到哈希数据并不能保证另一块数据不会有相同的哈希值,只是不太可能.所以考虑以下代码


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哈希值 不应该被用来存储密码.

另外,如果你想让id比这个短,你可以简单地把第一个的 x 字符的哈希值。但请记住,id越短,你得到两块数据有相同的自动生成id的几率就越高。

用这种方法,两块不同的数据有相同的自动生成id的几率大概是116^x。考虑一下你有多少数据,以及你希望id碰撞发生的可能性有多大.在一个应用的生命周期中,超过99%在我看来是合理的.所以,如果你有比如说100M的项目,从md5哈希中取前10个十六进制字符,将给你带来大约0.01%的可能性发生碰撞(当然假设没有谁项目是相同的)。

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

© www.soinside.com 2019 - 2024. All rights reserved.