While base64-encoded strings have a constant length depending on the length of data to encode. In base58 it depends on the exact data to encode, e.g. it is shorter if encoded data have more leading zeroes.
Building an aepp you may need to know the range of possible address lengths to validate an user-provided addresses (though better to use isAddressValid) or for designs of address-related components. Doing manual tests you may conclude that account address length is between 52 and 53 chars, but it is not correct.
import { MemoryAccount } from '@aeternity/aepp-sdk';
const result = new Array(10000)
.fill()
.map(() => MemoryAccount.generate().address.length)
.reduce((p, n) => ({ ...p, [n]: (p[n] ?? 0) + 1 }), {});
console.log(result);
Running the above code you would get something like { '51': 55, '52': 5021, '53': 4924 } depending on generated accounts. So, while the most of addresses have length between 52 and 53 chars, there is a ~0.55% chance to get an address of 51 chars.
Theoretically there can be even shorter addresses if they lucky to be prefixed with a long sequence of 0.
import { MemoryAccount, Encoding, encode, decode } from '@aeternity/aepp-sdk';
const publicKey = decode(MemoryAccount.generate().address);
for (let i = -1; i < publicKey.length; i += 1) {
if (i >= 0) publicKey[i] = 0;
const address = encode(publicKey, Encoding.AccountAddress);
console.log(address.length, address);
}
Therefore the minimum address length is 41 chars. All these addresses valid, for example ak_11111111111111111111111111111111273Ytsused to collect AENS name fees.