【问题标题】:Using a set of integers to generate unique key使用一组整数生成唯一键
【发布时间】:2015-05-11 11:37:06
【问题描述】:

现在我有一些整数集,比如说:

   set1 = {int1, int2, int3};
   set2 = {int2, int3, int1};
   set3 = {int1, int4, int2};

不考虑顺序或数字,所以set1和set2是一样的,而set3和其他两个不一样。

现在我想为这些集合生成一个唯一的密钥来区分它们,这样,set1 和 set2 应该生成相同的密钥。

我想了一会儿,我想到了总结整数的想法,但很容易证明是错误的。对集合进行排序并执行

key = n1 + n2*2^16 + n3*2^32

可能是一种可能的方法,但我想知道这是否可以更优雅地解决。 键可以是整数或字符串。

所以有人对尽快解决这个问题有一些想法吗?或者欢迎任何阅读材料。

更多信息: 这些数字实际上是颜色,所以每个整数都小于 0xffffff

【问题讨论】:

    标签: algorithm hash numbers integer set


    【解决方案1】:

    如果这些是小整数(例如,都在范围 (0,63) 内),那么您可以将每个集合表示为一个位串(1 表示集合中存在的任何整数;0 表示不存在的任何整数)。对于稀疏的大整数集,这在存储/内存方面会非常昂贵)。

    想到的另一种方法是对集合进行排序并将键形成为每个数字的数字表示的串联(由一些分隔符分隔)。所以集合 {2,1,3} -> "1/2/3"(使用 "/" 作为分隔符)和 {30,1,2,4} => "1/2/4/30"

    我想您也可以使用混合方法。所有元素

    【讨论】:

    • 谢谢!两种方式都非常具有启发性。
    • 不是真正的启发式。它们是简单的机械变换。 en.wikipedia.org/wiki/Heuristic ...这里的相关启发式是:“小整数集最有效地编码为位字符串”,而“任何包含较大整数的集合都被更好地视为数字字符串”)
    【解决方案2】:
    • 如果您的集合数量不是很大,我认为将每个集合散列成一个字符串可能是一种合适的解决方案。
    • 然后它们是较大的,您可以通过 mod 函数或其他方式将其变小。这样一来,他们就可以用同样的方式处理了。

    如果没有更好的想法,希望这对您的解决方案有所帮助。

    【讨论】:

    • 集合不大,但集合的数量很大,所以我必须计算大量时间的哈希。哈希成一个字符串可能会导致问题:{1, 2, 34} 可能会生成与 {12, 3, 4} 相同的键?
    【解决方案3】:

    我认为实际大小的键只能是一个哈希值 - 总会有几对输入对同一个键进行哈希处理,但您可以让这不太可能发生。

    我认为排序然后应用标准散列函数的想法很好,但我不喜欢你的散列乘数。如果算术是 mod 2^32,那么乘以 2^32 就是乘以零。如果是 mod 2^64,那么乘以 2^32 会丢失输入的前 32 位。

    我会使用类似Why chose 31 to do the multiplication in the hashcode() implementation ? 中描述的哈希函数,您可以在其中保留一个运行总计,将哈希值乘以某个奇数,然后再将下一个项目添加到其中。乘以奇数 mod 2^n 至少不会立即丢失信息。我建议使用 131,但 Java 有使用 31 的传统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2013-07-20
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多