基于既唯一又防止重复的模式数据创建 id
Creating an id based on schema data that is both unique and prevents duplicates
所以我将看起来像这样的数据插入到我的 mongo 数据库集合中,它是一些轮询数据
我打算做的是将 "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 创建函数 return 完全相同的值,即 12345,这样我就知道这里添加的投票是重复的。并且显然在这个过程中保持创建的 ID 与其他不同的民意调查完全唯一,以免创建不正确的重复 ID。
这可能吗?还是我要求的东西太高级了...
您可以使用散列函数来创建数据的散列。
但是您需要考虑到散列数据并不能保证另一条数据不会具有相同的散列值,这是不太可能的。
所以考虑下面的代码
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% 的可能性发生冲突(当然假设没有谁的项目是相同的)。
此外,它不是随机的,因此对于相同的字符串,您将始终获得相同的哈希值。
所以我将看起来像这样的数据插入到我的 mongo 数据库集合中,它是一些轮询数据
我打算做的是将 "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 创建函数 return 完全相同的值,即 12345,这样我就知道这里添加的投票是重复的。并且显然在这个过程中保持创建的 ID 与其他不同的民意调查完全唯一,以免创建不正确的重复 ID。
这可能吗?还是我要求的东西太高级了...
您可以使用散列函数来创建数据的散列。 但是您需要考虑到散列数据并不能保证另一条数据不会具有相同的散列值,这是不太可能的。 所以考虑下面的代码
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% 的可能性发生冲突(当然假设没有谁的项目是相同的)。
此外,它不是随机的,因此对于相同的字符串,您将始终获得相同的哈希值。