事情是,在第1个数字已经是ORACLE LONG,第二个中的日期(SQL迄今为止,还没有时间戳信息额外的),最后一个范围1000-100'000是一个短值。
我怎么可以创造某种哈希值,这将是最佳的每个组合独特之处?
字符串连接和转换为长后:
我不想这样,例如。
白天本月
12 1 - > 121
1 12 - > 121
事情是,在第1个数字已经是ORACLE LONG,第二个中的日期(SQL迄今为止,还没有时间戳信息额外的),最后一个范围1000-100'000是一个短值。
我怎么可以创造某种哈希值,这将是最佳的每个组合独特之处?
字符串连接和转换为长后:
我不想这样,例如。
12 1 - > 121
1 12 - > 121
当你有几个数值,需要有一个单一的“独一无二”(即,统计学不可能重复的)价值了出来,通常你可以用一个公式,如:
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
您的
12 1 --> 121
1 12 --> 121
问题很容易通过零填充的输入编号,以预期的每个输入字段的最大宽度固定。
例如,如果第一场的范围可以从0到10000和第二场的范围可以从0到100,你的例子变为:
00012 001 --> 00012001
00001 012 --> 00001012
在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)]