如何从3个不同的整数数字创造独特的整数倍(1甲骨文长,1个日期字段,1短)(how to creat

2019-08-03 05:42发布

事情是,在第1个数字已经是ORACLE LONG,第二个中的日期(SQL迄今为止,还没有时间戳信息额外的),最后一个范围1000-100'000是一个短值。
我怎么可以创造某种哈希值,这将是最佳的每个组合独特之处?

字符串连接和转换为长后:
我不想这样,例如。

白天本月

12 1 - > 121
1 12 - > 121

Answer 1:

当你有几个数值,需要有一个单一的“独一无二”(即,统计学不可能重复的)价值了出来,通常你可以用一个公式,如:

h = (a*P1 + b)*P2 + c

其中,P1和P2或者精心挑选的数目(例如,如果你知道“A”总是在1-31范围内,可以使用P1 = 32),或者,当你知道什么特别关于A,B的容许范围, ç最好的办法是让P1和P2为大素数(他们必须产生碰撞值机会最小)。 对于一个最优解的数学比这更复杂一点,但使用素数通常可以有一个体面的解决办法。

例如,Java实现.hashCode()用于阵列(或字符串)是这样的:

h = 0;
for (int i = 0; i < a.length; ++i)
    h = h * 31 + a[i];

尽管就个人而言,我会选择超过31的黄金更大的作为字符串可以很容易地碰撞,因为31位的增量可以说是相当常见的,比如里面的值:

"BB".hashCode() == "Aa".hashCode() == 2122


Answer 2:

您的

12 1  --> 121
1 12  --> 121

问题很容易通过零填充的输入编号,以预期的每个输入字段的最大宽度固定。

例如,如果第一场的范围可以从0到10000和第二场的范围可以从0到100,你的例子变为:

00012 001 --> 00012001
00001 012 --> 00001012


Answer 3:

在Python中,你可以使用这个:

#pip install pairing
import pairing as pf
n = [12,6,20,19]
print(n)
key = pf.pair(pf.pair(n[0],n[1]),
              pf.pair(n[2], n[3]))
print(key)
m = [pf.depair(pf.depair(key)[0]),
     pf.depair(pf.depair(key)[1])]
print(m)

输出是:

[12, 6, 20, 19]
477575
[(12, 6), (20, 19)]


文章来源: how to create unique integer number from 3 different integers numbers(1 Oracle Long, 1 Date Field, 1 Short)
标签: hash numbers