如何从唯一字符串生成唯一int?

我有一个带有String的对象,该对象具有唯一的id。(例如“ ocx7gf”或“ 67hfs8”),我需要为其提供int

hascode()的实现,该实现显然是唯一的。

如何以最简单/最快的方式将字符串转换为唯一的int?

10倍

编辑-确定。我已经知道String.hashcode是可能的。但是不建议在任何地方使用。实际上’,如果不建议使用其他任何方法-

如果我的对象在集合中并且需要哈希码,则应该使用还是不使用它。我应该将其连接到另一个字符串以使其更成功吗?

回答:

不,你 没有 需要有一个实现,它返回一个独特的价值,“明明”,因为很明显多数的实现将被打破。

您想要做的是在各个位之间有良好的分布,尤其是对于公用值(如果有任何值比其他值更常见)。除非对格式有特殊的了解,否则最好只使用字符串本身的哈希码。

通过对id格式限制的特殊了解,可以进行自定义并获得更好的性能,尽管错误的假设更可能使情况变得更糟。

编辑:对位的良好传播。

如此处和其他答案所述,完全唯一是不可能的,并且哈希冲突是可能的。使用散列的方法知道这一点并可以对其进行处理,但是它 确实

影响性能,因此我们希望冲突很少发生。

此外,哈希通常会重新哈希,因此我们的32位数字最终可能会减少到例如0到22范围内的1,并且我们希望在该范围内具有尽可能好的分布。

我们还希望通过不花太多时间来计算哈希来平衡这一点,以至于哈希本身就成为了瓶颈。不完美的平衡行为。

不良哈希方法的一个经典示例是针对X,Y整数的坐标对执行以下操作:

return X ^ Y;

尽管这样做非常好,可以从4 ^ 32个可能的输入中返回2 ^ 32个可能的值,但在现实世界中,使用X和Y等于({0,0},{1

,1},{2,2}等)都将散列为零,或者匹配对({2,3}和{3,2})将散列为相同的数字。我们可能会通过以下方式更好地为我们服务:

return ((X << 16) | (x >> 16)) ^ Y;

现在,与前者相比,存在 许多令人恐惧的可能值,但在实际情况下它往往会更好。

当然,如果您正在编写通用类(不知道有什么可能的输入)或对手头的目的有更好的了解,则还有另一项工作。例如,如果我使用的是Date对象,但知道它们都只是日期(时间部分始终为午夜)并且彼此之间的间隔只有几年,那么我可能更喜欢只使用日,月和年的低位数,超过标准的一位。的作家Date,虽然不能在这样的知识工作,并尽量满足大家。

因此,例如,如果我知道给定的字符串将始终由[az]或[0-9]范围内的6个不区分大小写的字符组成(您的情况似乎如此,但是从您的问题尚不清楚然后,我可能会使用一种算法,为每个字符分配一个0到35(每个字符36个可能的值)的值,然后遍历字符串,每次将当前值乘以36并加上下一个字符。

假设id分布良好,这就是方法,特别是如果我按以下顺序排列,即哈希中的低位数字与id中最频繁更改的char匹配(如果可以进行这样的调用)

,因此可以很好地将重新哈希处理到较小的范围内。

但是,由于肯定缺乏这种格式的知识,因此我无法确定地进行该调用,并且可能会使情况变得更糟(算法变慢,散列质量几乎没有甚至出现负增长)。

您拥有的一个优点是,由于它本身就是一个ID,因此大概没有其他不相等的对象具有相同的ID,因此不需要检查其他属性。这并不总是成立。

以上是 如何从唯一字符串生成唯一int? 的全部内容, 来源链接: utcz.com/qa/433739.html

回到顶部