If you think your shortcode is hurting performance (measure and you will know!), then you might want to consider caching its output in a transient. A good way to get a unique key would be to consider what could differentiate calls to your shortcode function:
- its name
- the attributes passed
- the site URL (in cases where multiple site URLs are valid, e.g. a mobile domain name)
You also need to keep the key length short -- under 45 characters. What I find is good is to take an MD5 hash of the concatenation of those items, which gives you a nice short key that is highly unlikely to clash with another key.
$key = md5(__FUNCTION__ . serialize($attrs) . site_url());
A further thing to consider is setting an expiry on your transient. If you don't, the transient will be autoloaded with all other autoloaded options (transients are stored in the options table). This will increase memory use on every page, possibly hurting the performance of your site (oh, the ironing). If you are storing a lot of data in your transient, and it isn't needed on every page/post, don't autoload it! (i.e. set any expiry)
Of course, you have to consider that it might all be easier / more effective to use a caching plugin, which will cache much more than just what your function is generating. Weigh your options.