我正在尝试解决单向缩进问题,一组作者希望在不透露自己的真实username
的情况下发布内容,因此是否存在用于散列无序的{{1}集合的算法/库} S'
有些人会建议,首先按字母顺序对集合进行排序,然后加入,最后进行散列,但这不是动态增长数组的理想解决方案。
补充问题(主要问题不是强制性的):
username
是否是作者之一?username
s的哈希值,那么会添加一个新作者,我们可以在不知道之前作者username
的情况下获得新哈希值吗?答案 0 :(得分:3)
您是否愿意接受一小部分误报,即如果有人检查,那些不是作者的名字会被错误地识别为作者? (概率可以任意小。)
如果你是,那么bloom filter将完全符合该法案。
答案 1 :(得分:1)
无论您是否知道其他作者的用户名,您始终都可以生成哈希。但是,您不能保证它是唯一哈希。
如果您事先知道所有用户名,则可以生成最小的完美哈希,但是每次添加用户名时,您都必须生成一个全新的哈希表 - 具有不同的哈希值。这显然不是一个好的解决方案。
这取决于你想要的最终键的样子。
一种可能性是为用户名分配唯一的顺序ID,然后对这些ID进行模糊处理,使它们看起来不像顺序ID。这类似于YouTube对其ID所做的操作 - 它们将64位数字转换为11个字符的base64字符串。我用C#中的代码写了一篇关于它的文章。查看http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=839。
而且,是的,这个过程是可逆的。
答案 2 :(得分:1)
听起来像单个哈希对你没什么好处。 1.您无法验证散列中是否有单个用户名;你需要知道所有的用户名。 2.如果不了解有关未散列的用户名的信息,则无法向哈希添加新用户(对于所有良好的哈希算法,向哈希添加用户的顺序都很重要。)
对于#2,部分解决方案是您不会保留所有用户名,只需保留所有现有用户的XOR。如果要添加新用户,请将其与现有用户进行异或,然后重新散列结果。然后,添加用户的顺序无关紧要。
但我认为,真正的解决方案只是拥有一组哈希值,而不是一组哈希值。有没有理由你不能这样做?然后,您可以轻松地按照自己的意愿保持设置顺序或无序,您可以轻松地将用户添加到集合中,并轻松检查给定作者是否已经在集合中。