### Godot version

v4.0.beta10.official [d0398f62f]

### System information

Windows 10, Vulkan

### Issue description

When I was testing my `debug_draw_3d` extension, I noticed that the graph titles change their size strangely.
For example, here, with a font size of 41 for one of the titles, instead of `fps5` it draws `fps6` with a font size of 14.
But the ascent of the font is taken correctly, which is why the title goes down a lot.
![godot windows editor dev x86_64_u0CvcAfqjh](https://user-images.githubusercontent.com/7782218/209420557-17f32fcc-c64c-44ff-9f08-4a11119d4ac8.gif)

I found that these hashing functions create the same hash for `fps5: 41`, `fps6: 14` and `fps8: 76`.
https://github.com/godotengine/godot/blob/f7cf9fb148140b86ee5795110373a0d55ff32860/scene/resources/font.cpp#L273-L291
https://github.com/godotengine/godot/blob/f7cf9fb148140b86ee5795110373a0d55ff32860/scene/resources/font.cpp#L303-L323
(also both of these parts of the code are repeated 3 times)

Here's what I get in MRP:
![image](https://user-images.githubusercontent.com/7782218/209420974-0cbcbb95-81a9-42e9-a9af-4b71b8715769.png)

Expected something like this:
![image](https://user-images.githubusercontent.com/7782218/209421473-4a019989-f432-40c0-b9af-c40ec969ade8.png)

Affected `Font` methods: `get_string_size`, `get_multiline_string_size`, `draw_string`, `draw_multiline_string`, `draw_string_outline`, `draw_multiline_string_outline`.

### Steps to reproduce

* Open MRP
* Notice the gray rectangles and the text somewhere near them (the text should be on top of the rectangles)
* Move the slider for the `second_font_size` parameter and watch glitches on some values.

Also, if you cache a lot of variants for `second_font_size`, and then change `first_font_size`(or vice versa), then there will be a more glitches:
![Godot_v4 0-beta10_win64_r0jJoStkQd](https://user-images.githubusercontent.com/7782218/209422373-c4ca1238-b351-4cbc-b451-136bbdb4fee0.gif)


### Minimal reproduction project

[Font Bad Hash.zip](https://github.com/godotengine/godot/files/10298021/Font.Bad.Hash.zip)

ClassDB::bind_method(D_METHOD("draw_multiline_string", "canvas_item", "pos", "text", "alignment", "width", "font_size", "max_lines", "modulate", "brk_flags", "jst_flags", "direction", "orientation"), &Font::draw_multiline_string, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL));
	ClassDB::bind_method(D_METHOD("draw_string_outline", "canvas_item", "pos", "text", "alignment", "width", "font_size", "size", "modulate", "jst_flags", "direction", "orientation"), &Font::draw_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL));
	ClassDB::bind_method(D_METHOD("draw_multiline_string_outline", "canvas_item", "pos", "text", "alignment", "width", "font_size", "max_lines", "size", "modulate", "brk_flags", "jst_flags", "direction", "orientation"), &Font::draw_multiline_string_outline, DEFVAL(HORIZONTAL_ALIGNMENT_LEFT), DEFVAL(-1), DEFVAL(DEFAULT_FONT_SIZE), DEFVAL(-1), DEFVAL(1), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(TextServer::BREAK_MANDATORY | TextServer::BREAK_WORD_BOUND), DEFVAL(TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_WORD_BOUND), DEFVAL(TextServer::DIRECTION_AUTO), DEFVAL(TextServer::ORIENTATION_HORIZONTAL));
	
	ClassDB::bind_method(D_METHOD("get_char_size", "char", "font_size"), &Font::get_char_size);
	ClassDB::bind_method(D_METHOD("draw_char", "canvas_item", "pos", "char", "font_size", "modulate"), &Font::draw_char, DEFVAL(Color(1.0, 1.0, 1.0)));
	ClassDB::bind_method(D_METHOD("draw_char_outline", "canvas_item", "pos", "char", "font_size", "size", "modulate"), &Font::draw_char_outline, DEFVAL(-1), DEFVAL(Color(1.0, 1.0, 1.0)));
	
	ClassDB::bind_method(D_METHOD("has_char", "char"), &Font::has_char);
	ClassDB::bind_method(D_METHOD("get_supported_chars"), &Font::get_supported_chars);
	ClassDB::bind_method(D_METHOD("is_language_supported", "language"), &Font::is_language_supported);
	ClassDB::bind_method(D_METHOD("is_script_supported", "script"), &Font::is_script_supported);
	ClassDB::bind_method(D_METHOD("get_supported_feature_list"), &Font::get_supported_feature_list);
	ClassDB::bind_method(D_METHOD("get_supported_variation_list"), &Font::get_supported_variation_list);
	ClassDB::bind_method(D_METHOD("get_face_count"), &Font::get_face_count);
}
void Font::_update_rids_fb(const Ref<Font> &p_f, int p_depth) const {
	ERR_FAIL_COND(p_depth > MAX_FALLBACK_DEPTH);
	if (p_f.is_valid()) {
		RID rid = p_f->_get_rid();
		if (rid.is_valid()) {
			rids.push_back(rid);
		}
		const TypedArray<Font> &_fallbacks = p_f->get_fallbacks();
		for (int i = 0; i < _fallbacks.size(); i++) {
			_update_rids_fb(_fallbacks[i], p_depth + 1);
		}
	}
}
void Font::_update_rids() const {