java – 如何从一个唯一的字符串生成一个唯一的int?

前端之家收集整理的这篇文章主要介绍了java – 如何从一个唯一的字符串生成一个唯一的int?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包含一个唯一的id的String的对象.
(如“ocx7gf”或“67hfs8”)
我需要提供一个int has()的实现,这将是显而易见的.

如何以最简单/最快速的方式将字符串转换为独特的int?@H_301_5@

10X.@H_301_5@

编辑 – 确定.我已经知道String.hashcode是可能的.但不推荐在任何地方.实际上,如果不推荐任何其他方法 – 如果我有我的对象在一个集合中,并且我需要哈希码,是否应该使用它.我应该将其连接到另一个字符串以使其更成功吗?@H_301_5@

解决方法

不,您不需要具有返回唯一值的实现,“显然”,显然大多数实现将被破坏.

你想要做的就是在一个很好的扩展位上,特别是对于普通值(如果任何值比其他值更常见).除了格式的特殊知识之外,那么使用字符串本身的哈希码就是最好的.@H_301_5@

特别了解您的id格式的限制,可能会自定义并导致更好的性能,尽管虚假假设更有可能使事情变得更好.@H_301_5@

编辑:在良好的位传播.@H_301_5@

如这里和其他答案所述,完全独特的是不可能的,哈希冲突是可能的.哈希使用方法知道这一点,可以处理它,但它会影响性能,所以我们希望碰撞是罕见的.@H_301_5@

此外,散列通常被重新散列,因此我们的32位数可能最终减少到例如.一个在0到22之间,我们希望尽可能好的分配.@H_301_5@

我们还想平衡这一点,而不是花费太长的时间来计算我们的哈希,它本身就成为一个瓶颈.一个不完美的平衡行为.@H_301_5@

一个坏的哈希方法的典型例子是一个X,Y的坐标对的一个,它是:@H_301_5@

return X ^ Y;

尽管在4 ^ 32个可能的输入中返回2 ^ 32个可能的值非常好,但在现实世界中,使用一组坐标(X和Y相等)({0,0},{1,1},{2,2}等等),这些都将哈希到零,或匹配的对({2,3}和{3,2}),它们将散列到相同的数字.我们可能更好地服务于:@H_301_5@

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

现在,与前者相比,这个可怕的价值是可怕的,但在现实世界的情况下往往更好.@H_301_5@

当然,如果你正在写一个通用课程(不知道有什么可能的输入),或者更好地了解手头的目的,那就有不同的工作.例如,如果我使用的是Date对象,但是知道它们都只是日期(时间总是在午夜),而且只能在几年之内,那么我可能更喜欢使用仅使用日,月,年龄较低的数字超过标准.日期的作者虽然不能在这样的知识上工作,而是要尽力照顾每一个人.@H_301_5@

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

假设在ids中有很好的传播,这将是方式,特别是如果我做出这样的命令,使得我的哈希中的低位数字与id中最频繁变化的字符匹配(如果可以这样调用),因此幸存的重新哈希到较小的范围.@H_301_5@

但是,由于缺乏这种格式的知识,我无法确定地进行这种调用,而且我可以使事情变得更糟(较慢的算法对于散列质量的影响甚微甚至不好).@H_301_5@

您拥有的一个优点是,由于它本身是一个ID,所以推测没有其他不相等的对象具有相同的ID,因此不需要检查其他属性.这并不总是持之以恒.@H_301_5@

猜你在找的Java相关文章