The rebuilding logic in v3 turns out to rely on the sign bit of the int being 1, so that when it gets and-ed with the long, it gets sign-extended:
. Long foo = 0xFFFFFFFFFFFFFFFFL;
int bar = 0xF0000000;
System.out.println(Long.toHexString(foo & bar));
System.out.println(Long.toHexString(foo & 0));
Thus, when the high order bit of the lower 32 bits of currentTimeMillis is instead zero, then the and zeros out the entire high 32 of the long we were trying to rebuild with.
pushed my suggested alternative above in 822ee88a38b3862d60b50748382ddf7957907cec, which does not rely on sign extension.