I recently researched languages for a programming curriculum that was to be taught to Latino high school students, and concluded that Scratch was the best choice. My reasoning is that most students you teach at such a young age will never pursue programming again, and bombarding them with the syntax that 'practical' languages use quickly leads to frustration. I'm sure a lot of people here will say, "I learned such-and-such at such age," but this is a self-selecting group for interest and natural ability in programming. Given a choice between high-level languages, you can choose Alice, Greenfoot, Stagecast, Lego Mindstorms, etc. but Scratch is the clear winner.
In terms of high-level concepts, I think understanding the logic behind software third graders use every day is important. Talk about how Internet requests are routed and returned; how social networking software interacts with a database; how cell phone calls are made; how keyboards poll for input. Understanding these algorithmically requires no programming expertise and not even a lot of expertise on your part to explain. It's simply a matter of breaking down the problem and thinking about it systematically. Your example explaining hash tables with filing cabinets is fantastic. Sorting can also be explained with filing cabinets. There's also the classic "how to teach a robot to make a PB&J sandwich," of course, to get their thoughts flowing.
At this age, children learn best with a story. They can follow a clear linear path from beginning (statement of characters), through their problem, and unto conclusion. If you want to have an impact beyond having everything go over their heads, make a show and tell (everybody loves pictures and something to look at), and if you want to wow them, show them something they haven't seen before. That part won't be hard. Let them touch it, if you bring something in.
Explaining anything more abstract than locations will probably fly over their heads. Sure, some are precocious and will grasp a hash table, but any collection of children, especially urban kids, is bound to be difficult to get them to understand anything more complicated than a toaster.
My suggestion is to start with something physical, like a breadboard if you have one, and show how changing wires can influence the lighting of LEDs.
Doing this will be far easier to capture their attention than something like decomposing the web stack in a console (which is fascinating if you have the background to appreciate it).
For example, you could start with the idea of a game like a simplified OutRun and brainstorm about what should happen. Well, you want to be able to change lanes, right? You would want to have cars coming your way, the speed increases as you go, etc. so that you end up with a list of things to happen that can be translated into code that does what they wanted to do.
I'm not sure this is a great example, but in principle, it would be to make them walk through the idea of defining what should happen in a program. To me, I don't think that the language matters, I don't even think that they really have to interact with the language at all or a very simple and specific language. What's important is to understand the process of: this happens ("I press the left arrow") so that happens ("the car moves to the left"), from which you can introduce conditions, loops and more.
As a starting point, you could also ask them about what software they use often and see if you can build something very simple around the same core concept.
Once they've figured out that, give them a bare-bones vocabulary (eg something like python, but don't tell them it's a programming language) to write the rules in.