It’s up to the developer!
- If the contract only creates a single token, we expect the SubId will often be 0
- For NFTs, the SubIds might be sequential
- In the case of “vault” type tokens, the subId might be the AssetId of the underlying asset
- ENS-style naming applications might use a namehash-type algorithm
- You can even use asset sub-ids to represent contract state! Pass some state into the asset subId, and you can then reconstruct the assetId in a separate contract or predicate to prove state (I’ve called this idea “packet-oriented programming”, probably needs a better explanation than this)