### Godot version

4.2.x master [5df98679672c12d96b4ac4d96ee17f1559207401]

### System information

Linux - GCC g++ 9.4.0 - Ubuntu 20.04 LTS

### Issue description

I somehow managed to get my Windows system into a broken state were the driver reports 145 extensions, but extension `#144` is an empty string.

Therefore Godot will crash while initializing Vulkan and looking for requested device extensions.

### Steps to reproduce

Execute the following code:

```cpp
HashMap<CharString, bool> requested_device_extensions;

CharString extension_name("");
CharString extension_name2("Hello");

requested_device_extensions.insert("HashMap must not be empty", true);

if (requested_device_extensions.has(extension_name2))
	printf("Has Hello\n");
if (requested_device_extensions.has(extension_name))
	printf("Has <empty>\n");
```

It will crash before <empty>. Callstack:

                                                                                                                                                                                                
```                                                                                                                                                                                                
1 hash_djb2                                                                                                                                                   hashfuncs.h        64   0x4a135d6 
2 HashMapHasherDefault::hash                                                                                                                                  hashfuncs.h        313  0x4a1decd 
3 HashMap<CharString, bool, HashMapHasherDefault, HashMapComparatorDefault<CharString>, DefaultTypedAllocator<HashMapElement<CharString, bool>>>::_hash       hash_map.h         85   0x4a1dbd9 
4 HashMap<CharString, bool, HashMapHasherDefault, HashMapComparatorDefault<CharString>, DefaultTypedAllocator<HashMapElement<CharString, bool>>>::_lookup_pos hash_map.h         106  0x4a1d8d7 
5 HashMap<CharString, bool, HashMapHasherDefault, HashMapComparatorDefault<CharString>, DefaultTypedAllocator<HashMapElement<CharString, bool>>>::has         hash_map.h         310  0x4a14788 
6 Main::setup                                                                                                                                                 main.cpp           2115 0x4a088d3 
7 main                                                                                                                                                        godot_linuxbsd.cpp 62   0x497f058 
```

The reason is that CharString decided to not create a pointer at all to save memory. Hence when hash_djb2 tries to read the first byte, it crashes.

### Minimal reproduction project

N / A
static _FORCE_INLINE_ uint32_t hash(const uint32_t p_int) { return hash_fmix32(p_int); }
	static _FORCE_INLINE_ uint32_t hash(const int32_t p_int) { return hash_fmix32(p_int); }
	static _FORCE_INLINE_ uint32_t hash(const uint16_t p_int) { return hash_fmix32(p_int); }
	static _FORCE_INLINE_ uint32_t hash(const int16_t p_int) { return hash_fmix32(p_int); }
	static _FORCE_INLINE_ uint32_t hash(const uint8_t p_int) { return hash_fmix32(p_int); }
	static _FORCE_INLINE_ uint32_t hash(const int8_t p_int) { return hash_fmix32(p_int); }
	static _FORCE_INLINE_ uint32_t hash(const Vector2i &p_vec) {
		uint32_t h = hash_murmur3_one_32(p_vec.x);
		h = hash_murmur3_one_32(p_vec.y, h);
		return hash_fmix32(h);
	}
	static _FORCE_INLINE_ uint32_t hash(const Vector3i &p_vec) {
		uint32_t h = hash_murmur3_one_32(p_vec.x);
		h = hash_murmur3_one_32(p_vec.y, h);
		h = hash_murmur3_one_32(p_vec.z, h);
		return hash_fmix32(h);
	}
	static _FORCE_INLINE_ uint32_t hash(const Vector4i &p_vec) {
		uint32_t h = hash_murmur3_one_32(p_vec.x);
		h = hash_murmur3_one_32(p_vec.y, h);
		h = hash_murmur3_one_32(p_vec.z, h);
		h = hash_murmur3_one_32(p_vec.w, h);
		return hash_fmix32(h);
	}
	static _FORCE_INLINE_ uint32_t hash(const Vector2 &p_vec) {
		uint32_t h = hash_murmur3_one_real(p_vec.x);
		h = hash_murmur3_one_real(p_vec.y, h);
		return hash_fmix32(h);
	}
	static _FORCE_INLINE_ uint32_t hash(const Vector3 &p_vec) {