根据 3 个不同的整数创建一个唯一的整数
Creating a unique integer based on 3 different integers
我想在 Java 中根据坐标 x
、y
和 y
创建一个名为 hash
的 int
w
.
x
和 y
的值是带符号的,通常是负数。
int
的大小是 32 位。
我想将 4 位分配给 w
(如果最高有效位不可用,则分配 3 位),将 14 位分配给 x
,将 14 位分配给 y
.
我尝试了以下方法,但我完全不明白为什么值会冲突:w + x << 4 + y << 18
.
例如,x = 1
在 w == 0
时与 y = 1
冲突。
这样做的好处如下:
- 在数据库中快速查找
- 比较单个整数比比较三个整数更快
- 无论如何都不会超过为每个整数分配的位数
这里唯一的问题是运算符优先级。 + 在 << 之前,所以你必须这样写:
w + (x << 4) + (y << 18)
这不会将 w
或 x
限制在它们分配的字段中,但这不会对哈希值造成不良影响。如果您使用 |
来组合它们,那么当 w
或 x
得到负数时,这将是一个糟糕的散列,但是 +
.
没问题
你的问题是运算符优先级:+
优先于<<
,所以你的表达式
w + x << 4 + y << 18
等同于
((w + x) << (4 + y)) << 18
试试这个:
w + (x << 4) + (y << 18)
int hash = w << 28 | (x & 0x3FFF) << 14 | y & 0x3FFF;
+
不是按位运算符。这将使它看起来像这样:
11110000000000000011111111111111
w -^ X -^ Y -^
我想在 Java 中根据坐标 x
、y
和 y
创建一个名为 hash
的 int
w
.
x
和 y
的值是带符号的,通常是负数。
int
的大小是 32 位。
我想将 4 位分配给 w
(如果最高有效位不可用,则分配 3 位),将 14 位分配给 x
,将 14 位分配给 y
.
我尝试了以下方法,但我完全不明白为什么值会冲突:w + x << 4 + y << 18
.
例如,x = 1
在 w == 0
时与 y = 1
冲突。
这样做的好处如下:
- 在数据库中快速查找
- 比较单个整数比比较三个整数更快
- 无论如何都不会超过为每个整数分配的位数
这里唯一的问题是运算符优先级。 + 在 << 之前,所以你必须这样写:
w + (x << 4) + (y << 18)
这不会将 w
或 x
限制在它们分配的字段中,但这不会对哈希值造成不良影响。如果您使用 |
来组合它们,那么当 w
或 x
得到负数时,这将是一个糟糕的散列,但是 +
.
你的问题是运算符优先级:+
优先于<<
,所以你的表达式
w + x << 4 + y << 18
等同于
((w + x) << (4 + y)) << 18
试试这个:
w + (x << 4) + (y << 18)
int hash = w << 28 | (x & 0x3FFF) << 14 | y & 0x3FFF;
+
不是按位运算符。这将使它看起来像这样:
11110000000000000011111111111111
w -^ X -^ Y -^