fauxflake icon indicating copy to clipboard operation
fauxflake copied to clipboard

EncodingProviders must use abs(machine id)

Open jonross opened this issue 9 years ago • 3 comments

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.

jonross avatar Mar 25 '15 18:03 jonross

@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?

abdielou avatar Jul 23 '15 21:07 abdielou

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.

jonross avatar Jul 24 '15 13:07 jonross

Good. Then I'll keep using your branch while this gets merged.

abdielou avatar Jul 24 '15 14:07 abdielou