如何从唯一字符串生成唯一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