Cooky, your question is completely valid. And it made me feel puzzled for a bit.
CEF switching is designed so that one "flow" of packets will always go over the same path. Flow meaning "a tcp connection" or a "udp session by an application". The reason for this is that you want to prevent out-of-order packets. Per-packet load-balancing can cause out-of-order delivery. TCP/IP has been designed so that it should be no problem when packets arrive out of order. However, reality is different. There used to be many TCP implementations that would consider out of order packets the same as dropped packets. And retransmissions would occur. The rule of thumb was that 1% packet drops would create a 50% performance loss (because of needless retransmissions, and waiting for retransmissions).
Older forwarding methods did stuff which was easiest to implement. I believe process-switching did round-robin. Can't remember the details of other switching methods. (Fast, flow, sse, what had you ?). When FIB-switching was build, it was by design that packets of the same flow would go over the same path. FIB-switching was renamed by marketing into CEF-switching. I believe a knob was later implemeneted to do round-robin load-balancing.
Back to the question. Why do you see that behaviour ?
Quick look at the Linux man-page of traceroute.
http://linux.die.net/man/8/traceroute
I see this switch:
-p port
For UDP tracing, specifies the destination port base traceroute will use (the destination port number will be incremented by each probe).
For ICMP tracing, specifies the initial icmp sequence value (incremented by each probe too).
For TCP specifies just the (constant) destination port to connect.
So it seems traceroute does not use the same portnumber for every packet it sends. The destination portnumber changes all the time. That would imply that the hash could vary every probe. And would explain why you see the behaviour you see.
If everything else fails .... read the man page.
I don't know what version of traceroute you are using. Maybe you're using a Windows flavor of traceroute. Windows traceroute does not have a -port flag. And I can't find any documentation about the Windows flavor. As usual. But I wouldn't be surprised if it did the same thing.
You could do a tcpdump or something to look at the portnumbers of your traceroute to confirm our suspicion.