我有W
名工人的总人数ID
。他们分组工作,每组中最多有M
名成员。
要为每个工作组合生成唯一的组名,请将ID标准化。我想在flattened排序的worker id列表上做MD5()
。我不确定我应该保留多少位数,以便在安全碰撞的情况下让人难忘。
log((26 + 10),W ^ M)是否足够?我应该保留多少个冗余的字符?我还有其他专门的哈希函数,可以更好地适应这种情况吗?
答案 0 :(得分:0)
最多10个对象的500个对象的组合总数约为2.5091E + 20,这将适合68位(base36中大约13个字符),但我没有看到一个简单的算法为每个组合分配一个数字。一个更简单的算法是这样的:如果你为每个人分配一个9位数字(0到511)并连接多达10个数字,你将得到90位。要对base36中的那些进行编码,您需要18个字符。
如果要使用base36中只有6个字符的哈希值(大约31位),则冲突的概率取决于应用程序生命周期中使用的组的总数。如果我们假设每天有10个新组(以前没有遇到过)并且应用程序将使用10年,我们将获得36500组。使用Nick Barnes提供的计算器表明,在这种情况下,有27%的机会发生碰撞。您可以根据您的具体情况调整假设,然后更改散列长度以适应您想要的最大碰撞几率。