哈希为无序集?

时间:2011-05-03 06:11:18

标签: algorithm hash html-lists

我正在尝试解决单向缩进问题,一组作者希望在不透露自己的真实username的情况下发布内容,因此是否存在用于散列无序的{{1}集合的算法/库} S'

有些人会建议,首先按字母顺序对集合进行排序,然后加入,最后进行散列,但这不是动态增长数组的理想解决方案。

补充问题(主要问题不是强制性的):

  1. 如果存在此类算法,我们是否可以通过哈希验证username是否是作者之一?
  2. 如果我们已经知道一组username s的哈希值,那么会添加一个新作者,我们可以在不知道之前作者username的情况下获得新哈希值吗?

3 个答案:

答案 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。如果要添加新用户,请将其与现有用户进行异或,然后重新散列结果。然后,添加用户的顺序无关紧要。

但我认为,真正的解决方案只是拥有一组哈希值,而不是一组哈希值。有没有理由你不能这样做?然后,您可以轻松地按照自己的意愿保持设置顺序或无序,您可以轻松地将用户添加到集合中,并轻松检查给定作者是否已经在集合中。