fauxflake
fauxflake copied to clipboard
EncodingProviders must use abs(machine id)
Negative machine IDs are possible, and SnowflakeEncodingProvider left-shifts these without checking, resulting in a small negative number that is OR'ed with the timestamp, erasing the timestamp. Example:
static class FixedIdProvider implements MachineIdProvider {
final long id;
FixedIdProvider(long id) {
this.id = id;
}
public long getMachineId() {
return id;
}
}
public static void main(String[] args) throws Exception
{
IdGenerator g1 = newSnowflakeIdGenerator(new FixedIdProvider(1));
System.out.println(g1.generateId(0).asString());
IdGenerator g2 = newSnowflakeIdGenerator(new FixedIdProvider(-1));
System.out.println(g2.generateId(0).asString());
}
Output:
080f6b18b1001000
fffffffffffff000
Creating a wrapper on e.g. MacPidMachineIdProvider is an easy temporary workaround.
@rholder Is there an ETA on this pull? @jonross There's another pull from @azderski with a different implementation but similar issue. Is it a different problem?
It looks like the other implementation fixes the MAC address value, however another machine ID implementation could still return < 0. Also I included a test.
Good. Then I'll keep using your branch while this gets merged.