【发布时间】:2016-03-30 13:44:51
【问题描述】:
以provided here为例,
我们创建了一个 64 位 ID,其中包含 shard ID = 16 位,类型 包含数据的 = 10 位,并且该数据在表中的位置 (本地 ID)= 36。
精明的添加学专家会注意到,只有添加 到 62 位。我过去在编译器和芯片设计方面的经验告诉我 储备钻头的重量是黄金。所以我们有两个(设置为 零)。
这是否意味着:
问题一:
它们可以有 2^16,范围为 0-65536 的分片?
类型 ID 为 2^10,范围 0-1024 类型?
Local ID 2^36,范围 0-68719476736 local id's ?
我也在尝试在 Java 中复制他们的哈希函数
|表示将两组 32 位分开,以便于可视化。
#表示位移46位,包含18位,其中2位保留-ShardId
~ 表示位移 36 位,包含 10 位 - 类型 ID 剩下的 36 位 - 本地 ID:
#0000 0000 0000 0000 00#~00 0000 0000~ 0000 | 0000 0000 0000 0000 0000 0000 0000 0000 |
- ShardID 3429 的二进制文件 = 1101 0110 0101
- 因此 (hashedValue >> 46) = 00 0000 1101 0110 0101 &
- 0xFFFF = 1111 1111 1111 1111
- ShardId = 00 0000 1101 0110 0101
问题二:
我理解需要 1. 和 2. 但是我不明白为什么我们需要按位运算符 & 0xFFFF,因为 4 和 2 实际上是相同的。
问题三:
我收到以下编译器错误:int 类型的文字 0xFFFFFFFFF 超出范围
public class BitExampleTest {
public static void main(String[] args) {
long pinId = 241294492511762325L;
unHash(pinId);
}
private static long hash(int shardId, int typeId, int localId){
return (shardId << 46) | (typeId << 36) | (localId << 0);
}
private static void unHash(long hashedValue){
long shardID = (hashedValue >> 46) & 0xFFFF;
long typeID = (hashedValue >> 36) & 0x3FF;
long localID = (hashedValue >> 0) & 0xFFFFFFFFF;
System.out.printf("shardID %s \n",shardID);
System.out.printf("typeID %s \n",typeID);
System.out.printf("localID %s \n",localID);
}
}
【问题讨论】:
-
Q3:使用文字长后缀:
0xFFFFFFFFFL。 -
很有趣的是,SO 没有关于位掩码的深入帖子。来自我的 +1
-
这里没有“散列值”。所有输入数据都存在于输出中。
标签: java