Your code fires early as millis approaches the wrap.
Assume the current value of millis is 4294967195.
snapshot_time = millis();
snapshot_time = 4294967195;
The first if is false (millis and snapshot_time are equal).
The second if becomes this...
if (millis() > snapshot_time + 150)
if (4294967195 > 4294967195 + 150)
if (4294967195 > 49)
...which is true. Yet 150 milliseconds has not elapsed.
This problem has been analyzed to death. I suggest you stick with what has been shown to work reliably (subtraction to calculate elapsed time).