问题是,第一个数字已经是ORACLE LONG,第二个是Date(SQL DATE,没有时间戳信息额外),最后一个是1000-100'000范围内的Short值.
如何创建一种最佳的每种组合唯一的哈希值?
字符串连接和转换为很久以后:
例如,我不想要这个.
12 1 - > 121
1 12 - > 121
lap*_*apo 15
当你有一些数值并且需要一个"唯一"(即统计上不太可能重复)的值时,你通常可以使用如下公式:
h = (a*P1 + b)*P2 + c
Run Code Online (Sandbox Code Playgroud)
其中P1和P2是精心选择的数字(例如,如果你知道'a'总是在1-31范围内,你可以使用P1 = 32),或者当你对a,b的允许范围一无所知时, c最好的方法是将P1和P2作为大素数(它们产生碰撞的值的机会最小).对于最佳解决方案,数学比这更复杂,但使用素数通常可以得到一个合适的解决方案.
例如,.hashCode()对于数组(或String)的Java实现类似于:
h = 0;
for (int i = 0; i < a.length; ++i)
h = h * 31 + a[i];
Run Code Online (Sandbox Code Playgroud)
即使个人,我会选择一个大于31的素数,因为String内的值很容易发生碰撞,因为31个位置的增量可能很常见,例如:
"BB".hashCode() == "Aa".hashCode() == 2122
Run Code Online (Sandbox Code Playgroud)
你的
12 1 --> 121
1 12 --> 121
Run Code Online (Sandbox Code Playgroud)
通过将输入数字用零填充到每个输入字段预期的最大宽度,可以轻松解决问题。
例如,如果第一个字段的范围可以从 0 到 10000,第二个字段的范围可以从 0 到 100,则您的示例将变为:
00012 001 --> 00012001
00001 012 --> 00001012
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11807 次 |
| 最近记录: |