问题是,第一个数字已经是 ORACLE LONG,
第二个是日期(SQL DATE,没有额外的时间戳信息),最后一个是 1000-100'000 范围内的 Short 值。
如何以最佳方式创建每个组合唯一的哈希值?
字符串连接并稍后转换为:
例如,我不想要这个。
日 月
12 1 --> 121
1 12 --> 121
当您有几个数值并且需要其中有一个“唯一”(即统计上不可能重复的)值时,您通常可以使用如下公式:
h = (a*P1 + b)*P2 + c
其中 P1 和 P2 要么是精心选择的数字(例如,如果您知道“a”始终在 1-31 范围内,则可以使用 P1=32),或者当您对 a、b 的允许范围一无所知时, c 最好的方法是将 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)