由两个整数生成一个独特的整数

2022-09-11 15:10:07 +08:00
 wdc63

我有两个整数 a 、b 。我想得到一个独特的整数 c ,让 a 、b 任何一个发生变化时,c 的值都是独特唯一的,且不需要反运算,即无需通过 c 得到 a 、b 。 我想到的方法是 a*(b 的位数+1) + b ,例如 123,234=123*1000+234=123234 。 由于我的程序中有大量的这种运算,请问各位大佬对此有没有经验,提供一个开销最小最小最小的算法。

3746 次点击
所在节点    程序员
33 条回复
LaTero
2022-09-11 16:22:35 +08:00
@wdc63 另外数学版本 f(a,b)=a*2^32+b, a,b∈Z∩[-2^31, 2^31-1]也不会碰撞
wdc63
2022-09-11 16:28:14 +08:00
@LaTero 噢,我理解错了,不好意思。
xuanbg
2022-09-11 16:34:47 +08:00
不对 A 、B 的性质加以限制的话,无论是加法、乘法还是他们的组合,无论如何组合,都无法保证结果的唯一性。
wdc63
2022-09-11 16:35:25 +08:00
@LaTero 确实更快,谢谢
chenzhekl
2022-09-11 19:45:08 +08:00
lz 给的算法也不是一个单射,反例:(123, 234) -> (123234), (12, 3234) -> (123234)。 @copper20 提到的 Cantor pairing function 应该是最好的选择了吧,不然就用哈希函数,然后自己处理极小概率的哈希碰撞。
wdc63
2022-09-11 20:14:19 +08:00
@chenzhekl 我用的 LaTero 的算法: ((int64)a << 32)+(int64)b ,实测比康托尔配对函数快一倍,而且康托尔配对函数在 int32 范围内最大支持到 25000 左右。
mlhadoop
2022-09-11 20:55:33 +08:00
+ 运算符 不就好了。?
mengzhuo
2022-09-11 21:47:45 +08:00
这个简单,wyhash 的原理,设大质数 P1 P2

h1, h2 = (a xor P1) * (b xor P2)
hash = h1 * h2

https://github.com/wangyi-fudan/wyhash
lrjia
2022-09-12 00:22:51 +08:00
直接用位运算,可能还会更快一些 ((int64)a << 32) & (int64)b
mxT52CRuqR6o5
2022-09-12 00:24:06 +08:00
直接连起来不就好了
yhvictor
2022-09-12 12:05:23 +08:00
@wdc63 10w 以内……
那就 a*10w+b 不就得了
正负都算上就 20w
aguesuka
2022-09-13 12:09:48 +08:00
long merge(int a, int b){
int pair[2] = {a, b};
return *((long*) &pair);
}

这个方法不用位运算, 也许是最快的. 不过也许您应该考虑使用 struct 或者 union
wdc63
2022-10-08 14:37:26 +08:00
@yhvictor 你这个算法鲁棒性不行,0*100000+100000 = 1*100000+0 ,况且不是一定完完全全十万内,绝大部分情况是,有少概率情况数据可能超过。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879280

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX