gpt4 book ai didi

java - 我怎样才能从一个唯一的字符串生成一个唯一的整数?

转载 作者:太空狗 更新时间:2023-10-29 23:00:45 25 4
gpt4 key购买 nike

我有一个包含唯一 id 的字符串对象。(例如“ocx7gf”或“67hfs8”)我需要为它提供一个 int hascode() 的实现,这显然是独一无二的。

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

10 倍。

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

最佳答案

不,您不需要“显然”需要一个返回唯一值的实现,因为显然大多数实现都会被破坏。

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

通过对您的 id 格式限制的特殊了解,可以进行自定义并获得更好的性能,但错误的假设更有可能使事情变得更糟而不是更好。

编辑:关于位的良好传播。

如此处和其他答案所述,完全唯一是不可能的,哈希冲突是可能的。使用哈希的方法知道这一点并可以处理它,但它确实会影响性能,因此我们希望冲突很少见。

此外,散列通常会重新散列,因此我们的 32 位数字最终可能会减少为例如一个在 0 到 22 范围内,我们希望在这个范围内尽可能好地分布。

我们还希望在不花太长时间计算散列的情况下取得平衡,以免散列本身成为瓶颈。不完美的平衡行为。

糟糕的散列方法的一个典型示例是 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 的作者虽然无法在这些知识上工作,但必须努力迎合所有人。

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

假设在 id 中分布良好,这将是可行的方法,特别是如果我进行排序以使哈希中的低位有效数字与 id 中变化最频繁的字符相匹配(如果这样的调用可以被制作),因此可以很好地重新散列到更小的范围。

但是,由于缺乏对格式的了解,我无法确定地进行调用,而且我很可能会使事情变得更糟(较慢的算法对哈希质量的增益很小甚至是负增益)。

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

关于java - 我怎样才能从一个唯一的字符串生成一个唯一的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5459436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com