These codes are not structured or consistent, but there's a reason probably lost in the mists of time to most.
Back in 1970, I started work at the Commercial Research Dept at General Manager, LMR, Euston and the project was to allocate ticket revenue to profit centre using NPAAS*, the predecessor of CAPRI.
Unlike CAPRI, which uses computer based logic, NPAAS used interviewers like me travelling on trains to record passengers' transits first-hand. Even with two of us, scooting down an Inter-City between each stop to record every passengers' details as they joined and alighted meant that the standard BR location code which was (I think) 5 digit numeric and not easily memorised wasn't suitable, so a 3 letter system, intended to be a memorable abbreviation, was invented.
No-one spent time allocating abbreviations to every station on BR, but as each route was surveyed we chose abbreviations for the stations involved; someone at the BRB kept records to avoid duplication, and where this happened, we obviously changed the code. They were all invented to fulfil what was seen as a short term requirement.
So, for instance, BHM was Birmingham New St. This was because, for our purposes, New St was the only station in central Birmingham; the others were all served by one service group (AKA profit centre) and were moribund at the time anyway (maybe Snow Hill had already closed?) . Similarly, we thought that NOR was a logical code for Northampton, but it had already been allocated by the ER to Normanton (wonder why the ER didn't use it for Norwich?).
This process only required codes for stations which had more than on service group and, quite reasonably, no thought was given to using a complicated structure - it was a form of 'first come, first served'.
Presumably, when a need was seen for abbreviations for every station on the network, these codes were adopted and the original codes were allowed to stand unaltered despite their flaws.
Looking through the codes, there are many cases other than New St where one station has monopolised a code that could apply to several - for instance, when LRD was allocated to London Rd., Guildford no thought was given to the existence of London Rd., Brighton. Other oddities were' for example, when the WR, presumably using the earlier spelling of Hanborough, included D in the abbreviation. There's also codes for curious locations such as Goldthorpe Police Station - presumably timing points on RRBs.
The surprise, to find that off-the-cuff abbreviations as part of a job in my youth are now an integral part of computerised timetable enquiries, is still great -who'd have thought?
*NPAAS - National Accounting & Audit System. I don't know what CAPRI stands for- after my time - I moved to freight.
Edit to remove wayward text at the very bottom