Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 应用hashCode()时如何仅获得正面结果?_Scala_Range_Hashcode - Fatal编程技术网

Scala 应用hashCode()时如何仅获得正面结果?

Scala 应用hashCode()时如何仅获得正面结果?,scala,range,hashcode,Scala,Range,Hashcode,我正在编写一个Scala代码,将一组唯一字符串转换为唯一ID。我应用了HashCode(),但是我得到了负数,我只需要处理正数。 我知道我必须使用math.abs来消除负值,但我不确定这是否是正确的解决方案。 如果我之前读过,像这样的东西可以解决我的问题 math.abs(hashCode()) * constant % size 如何确定正确的常数?大小是否表示字符串的总数 之前与该主题相关的问题仅通过使用math.abs解决了该问题,但如果字符串总数很大,则可能会发生溢出,并且也有可能得到

我正在编写一个Scala代码,将一组唯一字符串转换为唯一ID。我应用了HashCode(),但是我得到了负数,我只需要处理正数。 我知道我必须使用math.abs来消除负值,但我不确定这是否是正确的解决方案。 如果我之前读过,像这样的东西可以解决我的问题

math.abs(hashCode()) * constant % size
如何确定正确的常数?大小是否表示字符串的总数

之前与该主题相关的问题仅通过使用math.abs解决了该问题,但如果字符串总数很大,则可能会发生溢出,并且也有可能得到负数。通过将结果乘以常量并取大小的mod可能会有所帮助。这就是为什么我需要了解如何确定常数和大小


还有其他方法可以获取唯一字符串的唯一数字吗?

我们可以用另一种方法来表述您的问题:如何从具有相同范围的有符号数字中获取无符号数字?

假设您使用的是一个整数。其值从-2147483648到2147483647。现在需要将该值转换为0到2147483647的正范围


步骤1:
添加一个常量以将范围向上移动到0。您可以通过将2147483648添加到该值来完成此操作。但现在最高可能值远大于最大值

第二步:
因此,使用模将值移回所需的范围


例如,考虑值2000和2000000000。< /P>

| STEP              | MIN VALUE  | EXAMPLE 1  | EXAMPLE 2  | MAX VALUE  |
|-------------------|------------|------------|------------|------------|
| original          |-2147483648 |   -2000    | 2000000000 | 2147483647 |
| add 2147483648    |     0      | 2147481648 | 4147483648 | 4294967295 |
| modulo 2147483648 |     0      | 2147481648 | 2000000001 | 2147483647 |
最后的公式是:

(NUMBER + 2147483648) % 2147481648

警告:
哈希代码的设计目的不是提供唯一的值。两个不同的字符串有可能得到相同的哈希值。此外,哈希上的任何缩放操作(如除法、模)都会进一步降低唯一性


要从
Int
中删除符号,只需使用
.abs
。它在
Int.MinValue
上确实会中断,但您可以将其作为特例:

def stripSign(n: Int) = math.abs(n) max 0
或者干脆删除符号位:

def stripSign2(n: Int) = n & Int.MaxValue
或者只使用负数(它们到底有什么问题?)

对于您的另一个问题,您无法将一组唯一的字符串转换为Int,并保证不会有重复(原因很简单,字符串比distinct
Int
s多,因此,如果您想为每个字符串分配一个唯一的Int,那么在用完字符串之前就用完了Int),因此,您必须能够处理碰撞,无论这种情况多么罕见


您只能通过延长散列长度来降低冲突概率(使用32位散列代码,在大约75000个字符串的总体中,31位(如果您不想要负数),至少有50%的冲突概率为55000,但使用64位散列,则为“幻数”大约为50亿,前提是您的哈希函数足够好,并且生成的数字分布非常均匀)

我没有从上面提到的帖子中得到问题的答案。为什么不说
你单独使用Math.abs()的想法是有缺陷的:它并不总是返回正数
还解释了散列码不是唯一的。我想了解如何应用我问题中提到的公式来提高散列码的唯一性result@saad乘法和mod对唯一性没有帮助。然而,我试图概括你的问题,并给出了一个可能的解决办法。