From 308e37a2caa212f7d2ddc7fdb882afa1556a8ef4 Mon Sep 17 00:00:00 2001 From: Gavin Sherry Date: Tue, 29 Nov 2016 12:51:36 -0800 Subject: [PATCH] Ensure sequence number is appropriately masked to prevent it clobbering machine id --- .../provider/twitter/SnowflakeDecodingUtils.java | 2 +- .../provider/twitter/SnowflakeEncodingProvider.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeDecodingUtils.java b/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeDecodingUtils.java index fe0c692..8b5a05c 100644 --- a/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeDecodingUtils.java +++ b/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeDecodingUtils.java @@ -48,6 +48,6 @@ public static long decodeMachineId(long id) { * @param id the id to decode from */ public static int decodeSequence(long id) { - return (int)(id & 0x0000000000000FFF); + return (int)(id & SnowflakeEncodingProvider.SEQUENCE_MASK); } } diff --git a/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeEncodingProvider.java b/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeEncodingProvider.java index ad6d283..bfa391a 100644 --- a/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeEncodingProvider.java +++ b/fauxflake-core/src/main/java/com/github/rholder/fauxflake/provider/twitter/SnowflakeEncodingProvider.java @@ -47,6 +47,12 @@ public class SnowflakeEncodingProvider implements EncodingProvider { */ public static final int MAX_SEQUENCE_NUMBERS = 4096; + /** + * Number of bits needed to represent all sequence numbers + */ + public static final int SEQUENCE_BITS = 12; + public static final int SEQUENCE_MASK = ~(-1 << SEQUENCE_BITS); + /** * Number of bits to shift the time over */ @@ -68,9 +74,13 @@ public SnowflakeEncodingProvider(long machineId) { this.shiftedMachineId = ((machineId % MACHINE_CODES) << SHIFT_MACHINE_CODE_BITS); } + /** + * Returns a Snowflake ID. Note that only the lower order 12 bits of the sequence number are + * used + */ @Override public byte[] encodeAsBytes(long time, int sequence) { - long v = ((time - EPOCH) << SHIFT_TIME_BITS) | shiftedMachineId | sequence; + long v = ((time - EPOCH) << SHIFT_TIME_BITS) | shiftedMachineId | (sequence & SEQUENCE_MASK); byte[] buffer = new byte[8]; buffer[0] = (byte)(v >>> 56);