diff --git a/src/database.rs b/src/database.rs
index d8734b51a1668d9ec3f3c0d9279b8bdb5cc2a73d..bacf3b95e10967e3af99d1e3e182cf4879dad713 100644
--- a/src/database.rs
+++ b/src/database.rs
@@ -217,7 +217,7 @@ pub async fn load_or_create(config: Config) -> Result<Self> {
     }
 
     pub async fn watch(&self, user_id: &UserId, device_id: &DeviceId) {
-        let userid_bytes = user_id.to_string().as_bytes().to_vec();
+        let userid_bytes = user_id.as_bytes().to_vec();
         let mut userid_prefix = userid_bytes.clone();
         userid_prefix.push(0xff);
 
@@ -241,7 +241,7 @@ pub async fn watch(&self, user_id: &UserId, device_id: &DeviceId) {
 
         // Events for rooms we are in
         for room_id in self.rooms.rooms_joined(user_id).filter_map(|r| r.ok()) {
-            let roomid_bytes = room_id.to_string().as_bytes().to_vec();
+            let roomid_bytes = room_id.as_bytes().to_vec();
             let mut roomid_prefix = roomid_bytes.clone();
             roomid_prefix.push(0xff);
 
diff --git a/src/database/account_data.rs b/src/database/account_data.rs
index 38e6c32cea688ba993aa16cfebe63f5ceb638b86..f3832ea5debcc0dfafb828d5e53fb68ce56a301a 100644
--- a/src/database/account_data.rs
+++ b/src/database/account_data.rs
@@ -30,7 +30,7 @@ pub fn update<T: Serialize>(
             .as_bytes()
             .to_vec();
         prefix.push(0xff);
-        prefix.extend_from_slice(&user_id.to_string().as_bytes());
+        prefix.extend_from_slice(&user_id.as_bytes());
         prefix.push(0xff);
 
         // Remove old entry
@@ -42,7 +42,7 @@ pub fn update<T: Serialize>(
         let mut key = prefix;
         key.extend_from_slice(&globals.next_count()?.to_be_bytes());
         key.push(0xff);
-        key.extend_from_slice(event_type.to_string().as_bytes());
+        key.extend_from_slice(event_type.as_ref().as_bytes());
 
         let json = serde_json::to_value(data).expect("all types here can be serialized"); // TODO: maybe add error handling
         if json.get("type").is_none() || json.get("content").is_none() {
@@ -89,7 +89,7 @@ pub fn changes_since(
             .as_bytes()
             .to_vec();
         prefix.push(0xff);
-        prefix.extend_from_slice(&user_id.to_string().as_bytes());
+        prefix.extend_from_slice(&user_id.as_bytes());
         prefix.push(0xff);
 
         // Skip the data that's exactly at since, because we sent that last time
@@ -135,7 +135,7 @@ fn find_event(
             .as_bytes()
             .to_vec();
         prefix.push(0xff);
-        prefix.extend_from_slice(&user_id.to_string().as_bytes());
+        prefix.extend_from_slice(&user_id.as_bytes());
         prefix.push(0xff);
         let kind = kind.clone();
 
@@ -148,7 +148,7 @@ fn find_event(
                         k.rsplit(|&b| b == 0xff)
                             .next()
                             .map(|current_event_type| {
-                                current_event_type == kind.to_string().as_bytes()
+                                current_event_type == kind.as_ref().as_bytes()
                             })
                             .unwrap_or(false)
                     })
diff --git a/src/database/key_backups.rs b/src/database/key_backups.rs
index 4c65354de4cdd277f2cf7d5a5ec3f2834b8eadde..0f9af2eb9b01f45da4ae0771ef61a5f6c6216df3 100644
--- a/src/database/key_backups.rs
+++ b/src/database/key_backups.rs
@@ -24,7 +24,7 @@ pub fn create_backup(
     ) -> Result<String> {
         let version = globals.next_count()?.to_string();
 
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&version.as_bytes());
 
@@ -39,7 +39,7 @@ pub fn create_backup(
     }
 
     pub fn delete_backup(&self, user_id: &UserId, version: &str) -> Result<()> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&version.as_bytes());
 
@@ -67,7 +67,7 @@ pub fn update_backup(
         backup_metadata: &BackupAlgorithm,
         globals: &super::globals::Globals,
     ) -> Result<String> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&version.as_bytes());
 
@@ -89,7 +89,7 @@ pub fn update_backup(
     }
 
     pub fn get_latest_backup(&self, user_id: &UserId) -> Result<Option<(String, BackupAlgorithm)>> {
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         self.backupid_algorithm
             .scan_prefix(&prefix)
@@ -113,7 +113,7 @@ pub fn get_latest_backup(&self, user_id: &UserId) -> Result<Option<(String, Back
     }
 
     pub fn get_backup(&self, user_id: &UserId, version: &str) -> Result<Option<BackupAlgorithm>> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(version.as_bytes());
 
@@ -132,7 +132,7 @@ pub fn add_key(
         key_data: &KeyBackupData,
         globals: &super::globals::Globals,
     ) -> Result<()> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(version.as_bytes());
 
@@ -147,7 +147,7 @@ pub fn add_key(
             .insert(&key, &globals.next_count()?.to_be_bytes())?;
 
         key.push(0xff);
-        key.extend_from_slice(room_id.to_string().as_bytes());
+        key.extend_from_slice(room_id.as_bytes());
         key.push(0xff);
         key.extend_from_slice(session_id.as_bytes());
 
@@ -160,7 +160,7 @@ pub fn add_key(
     }
 
     pub fn count_keys(&self, user_id: &UserId, version: &str) -> Result<usize> {
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         prefix.extend_from_slice(version.as_bytes());
 
@@ -168,7 +168,7 @@ pub fn count_keys(&self, user_id: &UserId, version: &str) -> Result<usize> {
     }
 
     pub fn get_etag(&self, user_id: &UserId, version: &str) -> Result<String> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&version.as_bytes());
 
@@ -187,7 +187,7 @@ pub fn get_all(
         user_id: &UserId,
         version: &str,
     ) -> Result<BTreeMap<RoomId, RoomKeyBackup>> {
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         prefix.extend_from_slice(version.as_bytes());
         prefix.push(0xff);
@@ -240,7 +240,7 @@ pub fn get_room(
         version: &str,
         room_id: &RoomId,
     ) -> BTreeMap<String, KeyBackupData> {
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         prefix.extend_from_slice(version.as_bytes());
         prefix.push(0xff);
@@ -278,7 +278,7 @@ pub fn get_session(
         room_id: &RoomId,
         session_id: &str,
     ) -> Result<Option<KeyBackupData>> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(version.as_bytes());
         key.push(0xff);
@@ -297,7 +297,7 @@ pub fn get_session(
     }
 
     pub fn delete_all_keys(&self, user_id: &UserId, version: &str) -> Result<()> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&version.as_bytes());
         key.push(0xff);
@@ -320,7 +320,7 @@ pub fn delete_room_keys(
         version: &str,
         room_id: &RoomId,
     ) -> Result<()> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&version.as_bytes());
         key.push(0xff);
@@ -346,7 +346,7 @@ pub fn delete_room_key(
         room_id: &RoomId,
         session_id: &str,
     ) -> Result<()> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&version.as_bytes());
         key.push(0xff);
diff --git a/src/database/rooms.rs b/src/database/rooms.rs
index 5d4362617c10194e31765fd6307c8b0c2fc80503..ef1e55814ff41728fe03264588100197a2b67e4c 100644
--- a/src/database/rooms.rs
+++ b/src/database/rooms.rs
@@ -151,7 +151,7 @@ pub fn state_get(
         event_type: &EventType,
         state_key: &str,
     ) -> Result<Option<PduEvent>> {
-        let mut key = event_type.to_string().as_bytes().to_vec();
+        let mut key = event_type.as_ref().as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&state_key.as_bytes());
 
@@ -416,7 +416,7 @@ pub fn get_pdu_json(&self, event_id: &EventId) -> Result<Option<serde_json::Valu
     /// Returns the pdu's id.
     pub fn get_pdu_id(&self, event_id: &EventId) -> Result<Option<IVec>> {
         self.eventid_pduid
-            .get(event_id.to_string().as_bytes())?
+            .get(event_id.as_bytes())?
             .map_or(Ok(None), |pdu_id| Ok(Some(pdu_id)))
     }
 
@@ -690,7 +690,7 @@ pub fn append_pdu(
                         .split_terminator(|c: char| !c.is_alphanumeric())
                         .map(str::to_lowercase)
                     {
-                        let mut key = pdu.room_id.to_string().as_bytes().to_vec();
+                        let mut key = pdu.room_id.as_bytes().to_vec();
                         key.push(0xff);
                         key.extend_from_slice(word.as_bytes());
                         key.push(0xff);
@@ -1264,7 +1264,7 @@ pub fn pdus_since(
         room_id: &RoomId,
         since: u64,
     ) -> Result<impl DoubleEndedIterator<Item = Result<(IVec, PduEvent)>>> {
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         // Skip the first pdu if it's exactly at since, because we sent that last time
@@ -1298,7 +1298,7 @@ pub fn pdus_until(
         until: u64,
     ) -> impl Iterator<Item = Result<(IVec, PduEvent)>> {
         // Create the first part of the full pdu id
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let mut current = prefix.clone();
@@ -1332,7 +1332,7 @@ pub fn pdus_after(
         from: u64,
     ) -> impl Iterator<Item = Result<(IVec, PduEvent)>> {
         // Create the first part of the full pdu id
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let mut current = prefix.clone();
@@ -1883,9 +1883,9 @@ pub fn rooms_left(&self, user_id: &UserId) -> impl Iterator<Item = Result<RoomId
     }
 
     pub fn once_joined(&self, user_id: &UserId, room_id: &RoomId) -> Result<bool> {
-        let mut userroom_id = user_id.to_string().as_bytes().to_vec();
+        let mut userroom_id = user_id.as_bytes().to_vec();
         userroom_id.push(0xff);
-        userroom_id.extend_from_slice(room_id.to_string().as_bytes());
+        userroom_id.extend_from_slice(room_id.as_bytes());
 
         Ok(self.roomuseroncejoinedids.get(userroom_id)?.is_some())
     }
diff --git a/src/database/rooms/edus.rs b/src/database/rooms/edus.rs
index 084e4a12816e2a0394da80070d1af3eee319c061..9e43fe17af9d915b7d2e34a560c13cb962557247 100644
--- a/src/database/rooms/edus.rs
+++ b/src/database/rooms/edus.rs
@@ -34,7 +34,7 @@ pub fn readreceipt_update(
         event: EduEvent,
         globals: &super::super::globals::Globals,
     ) -> Result<()> {
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         // Remove old entry
@@ -49,7 +49,7 @@ pub fn readreceipt_update(
                 key.rsplit(|&b| b == 0xff)
                     .next()
                     .expect("rsplit always returns an element")
-                    == user_id.to_string().as_bytes()
+                    == user_id.as_bytes()
             })
         {
             // This is the old room_latest
@@ -59,7 +59,7 @@ pub fn readreceipt_update(
         let mut room_latest_id = prefix;
         room_latest_id.extend_from_slice(&globals.next_count()?.to_be_bytes());
         room_latest_id.push(0xff);
-        room_latest_id.extend_from_slice(&user_id.to_string().as_bytes());
+        room_latest_id.extend_from_slice(&user_id.as_bytes());
 
         self.readreceiptid_readreceipt.insert(
             room_latest_id,
@@ -76,7 +76,7 @@ pub fn readreceipts_since(
         room_id: &RoomId,
         since: u64,
     ) -> Result<impl Iterator<Item = Result<Raw<ruma::events::AnySyncEphemeralRoomEvent>>>> {
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let mut first_possible_edu = prefix.clone();
@@ -102,9 +102,9 @@ pub fn private_read_set(
         count: u64,
         globals: &super::super::globals::Globals,
     ) -> Result<()> {
-        let mut key = room_id.to_string().as_bytes().to_vec();
+        let mut key = room_id.as_bytes().to_vec();
         key.push(0xff);
-        key.extend_from_slice(&user_id.to_string().as_bytes());
+        key.extend_from_slice(&user_id.as_bytes());
 
         self.roomuserid_privateread
             .insert(&key, &count.to_be_bytes())?;
@@ -118,9 +118,9 @@ pub fn private_read_set(
     /// Returns the private read marker.
     #[tracing::instrument(skip(self))]
     pub fn private_read_get(&self, room_id: &RoomId, user_id: &UserId) -> Result<Option<u64>> {
-        let mut key = room_id.to_string().as_bytes().to_vec();
+        let mut key = room_id.as_bytes().to_vec();
         key.push(0xff);
-        key.extend_from_slice(&user_id.to_string().as_bytes());
+        key.extend_from_slice(&user_id.as_bytes());
 
         self.roomuserid_privateread.get(key)?.map_or(Ok(None), |v| {
             Ok(Some(utils::u64_from_bytes(&v).map_err(|_| {
@@ -131,9 +131,9 @@ pub fn private_read_get(&self, room_id: &RoomId, user_id: &UserId) -> Result<Opt
 
     /// Returns the count of the last typing update in this room.
     pub fn last_privateread_update(&self, user_id: &UserId, room_id: &RoomId) -> Result<u64> {
-        let mut key = room_id.to_string().as_bytes().to_vec();
+        let mut key = room_id.as_bytes().to_vec();
         key.push(0xff);
-        key.extend_from_slice(&user_id.to_string().as_bytes());
+        key.extend_from_slice(&user_id.as_bytes());
 
         Ok(self
             .roomuserid_lastprivatereadupdate
@@ -155,7 +155,7 @@ pub fn typing_add(
         timeout: u64,
         globals: &super::super::globals::Globals,
     ) -> Result<()> {
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let count = globals.next_count()?.to_be_bytes();
@@ -166,10 +166,10 @@ pub fn typing_add(
         room_typing_id.extend_from_slice(&count);
 
         self.typingid_userid
-            .insert(&room_typing_id, &*user_id.to_string().as_bytes())?;
+            .insert(&room_typing_id, &*user_id.as_bytes())?;
 
         self.roomid_lasttypingupdate
-            .insert(&room_id.to_string().as_bytes(), &count)?;
+            .insert(&room_id.as_bytes(), &count)?;
 
         Ok(())
     }
@@ -181,7 +181,7 @@ pub fn typing_remove(
         room_id: &RoomId,
         globals: &super::super::globals::Globals,
     ) -> Result<()> {
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let user_id = user_id.to_string();
@@ -200,10 +200,8 @@ pub fn typing_remove(
         }
 
         if found_outdated {
-            self.roomid_lasttypingupdate.insert(
-                &room_id.to_string().as_bytes(),
-                &globals.next_count()?.to_be_bytes(),
-            )?;
+            self.roomid_lasttypingupdate
+                .insert(&room_id.as_bytes(), &globals.next_count()?.to_be_bytes())?;
         }
 
         Ok(())
@@ -215,7 +213,7 @@ fn typings_maintain(
         room_id: &RoomId,
         globals: &super::super::globals::Globals,
     ) -> Result<()> {
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let current_timestamp = utils::millis_since_unix_epoch();
@@ -248,10 +246,8 @@ fn typings_maintain(
         }
 
         if found_outdated {
-            self.roomid_lasttypingupdate.insert(
-                &room_id.to_string().as_bytes(),
-                &globals.next_count()?.to_be_bytes(),
-            )?;
+            self.roomid_lasttypingupdate
+                .insert(&room_id.as_bytes(), &globals.next_count()?.to_be_bytes())?;
         }
 
         Ok(())
@@ -268,7 +264,7 @@ pub fn last_typing_update(
 
         Ok(self
             .roomid_lasttypingupdate
-            .get(&room_id.to_string().as_bytes())?
+            .get(&room_id.as_bytes())?
             .map_or(Ok::<_, Error>(None), |bytes| {
                 Ok(Some(utils::u64_from_bytes(&bytes).map_err(|_| {
                     Error::bad_database("Count in roomid_lastroomactiveupdate is invalid.")
@@ -281,7 +277,7 @@ pub fn typings_all(
         &self,
         room_id: &RoomId,
     ) -> Result<SyncEphemeralRoomEvent<ruma::events::typing::TypingEventContent>> {
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let mut user_ids = Vec::new();
@@ -322,11 +318,11 @@ pub fn update_presence(
 
         let count = globals.next_count()?.to_be_bytes();
 
-        let mut presence_id = room_id.to_string().as_bytes().to_vec();
+        let mut presence_id = room_id.as_bytes().to_vec();
         presence_id.push(0xff);
         presence_id.extend_from_slice(&count);
         presence_id.push(0xff);
-        presence_id.extend_from_slice(&presence.sender.to_string().as_bytes());
+        presence_id.extend_from_slice(&presence.sender.as_bytes());
 
         self.presenceid_presence.insert(
             presence_id,
@@ -334,7 +330,7 @@ pub fn update_presence(
         )?;
 
         self.userid_lastpresenceupdate.insert(
-            &user_id.to_string().as_bytes(),
+            &user_id.as_bytes(),
             &utils::millis_since_unix_epoch().to_be_bytes(),
         )?;
 
@@ -345,7 +341,7 @@ pub fn update_presence(
     #[tracing::instrument(skip(self))]
     pub fn ping_presence(&self, user_id: &UserId) -> Result<()> {
         self.userid_lastpresenceupdate.insert(
-            &user_id.to_string().as_bytes(),
+            &user_id.as_bytes(),
             &utils::millis_since_unix_epoch().to_be_bytes(),
         )?;
 
@@ -355,7 +351,7 @@ pub fn ping_presence(&self, user_id: &UserId) -> Result<()> {
     /// Returns the timestamp of the last presence update of this user in millis since the unix epoch.
     pub fn last_presence_update(&self, user_id: &UserId) -> Result<Option<u64>> {
         self.userid_lastpresenceupdate
-            .get(&user_id.to_string().as_bytes())?
+            .get(&user_id.as_bytes())?
             .map(|bytes| {
                 utils::u64_from_bytes(&bytes).map_err(|_| {
                     Error::bad_database("Invalid timestamp in userid_lastpresenceupdate.")
@@ -398,7 +394,7 @@ pub fn presence_maintain(
                 .try_into()
                 .map_err(|_| Error::bad_database("Invalid UserId in userid_lastpresenceupdate."))?;
             for room_id in rooms.rooms_joined(&user_id).filter_map(|r| r.ok()) {
-                let mut presence_id = room_id.to_string().as_bytes().to_vec();
+                let mut presence_id = room_id.as_bytes().to_vec();
                 presence_id.push(0xff);
                 presence_id.extend_from_slice(&count);
                 presence_id.push(0xff);
@@ -424,7 +420,7 @@ pub fn presence_maintain(
             }
 
             self.userid_lastpresenceupdate.insert(
-                &user_id.to_string().as_bytes(),
+                &user_id.as_bytes(),
                 &utils::millis_since_unix_epoch().to_be_bytes(),
             )?;
         }
@@ -443,7 +439,7 @@ pub fn presence_since(
     ) -> Result<HashMap<UserId, PresenceEvent>> {
         self.presence_maintain(rooms, globals)?;
 
-        let mut prefix = room_id.to_string().as_bytes().to_vec();
+        let mut prefix = room_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         let mut first_possible_edu = prefix.clone();
diff --git a/src/database/uiaa.rs b/src/database/uiaa.rs
index 381a7016ad6378e8d635ed6c0370dbecd83506eb..4c33b867ef877d5a6884736c78587667ed823baa 100644
--- a/src/database/uiaa.rs
+++ b/src/database/uiaa.rs
@@ -148,7 +148,7 @@ fn update_uiaa_session(
         device_id: &DeviceId,
         uiaainfo: Option<&UiaaInfo>,
     ) -> Result<()> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -170,7 +170,7 @@ fn get_uiaa_session(
         device_id: &DeviceId,
         session: &str,
     ) -> Result<UiaaInfo> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
diff --git a/src/database/users.rs b/src/database/users.rs
index ddbfd38ac4044c54ccbb6d5ac83b9b250ce61235..c794e52f47fe2f25136b562fc1bee906c51fea4a 100644
--- a/src/database/users.rs
+++ b/src/database/users.rs
@@ -185,7 +185,7 @@ pub fn create_device(
         // This method should never be called for nonexistent users.
         assert!(self.exists(user_id)?);
 
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -208,7 +208,7 @@ pub fn create_device(
 
     /// Removes a device from a user.
     pub fn remove_device(&self, user_id: &UserId, device_id: &DeviceId) -> Result<()> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -234,7 +234,7 @@ pub fn remove_device(&self, user_id: &UserId, device_id: &DeviceId) -> Result<()
 
     /// Returns an iterator over all device ids of this user.
     pub fn all_device_ids(&self, user_id: &UserId) -> impl Iterator<Item = Result<Box<DeviceId>>> {
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         // All devices have metadata
         self.userdeviceid_metadata
@@ -254,7 +254,7 @@ pub fn all_device_ids(&self, user_id: &UserId) -> impl Iterator<Item = Result<Bo
 
     /// Replaces the access token of one device.
     pub fn set_token(&self, user_id: &UserId, device_id: &DeviceId, token: &str) -> Result<()> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -282,7 +282,7 @@ pub fn add_one_time_key(
         one_time_key_value: &OneTimeKey,
         globals: &super::globals::Globals,
     ) -> Result<()> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(device_id.as_bytes());
 
@@ -305,10 +305,8 @@ pub fn add_one_time_key(
                 .expect("OneTimeKey::to_string always works"),
         )?;
 
-        self.userid_lastonetimekeyupdate.insert(
-            &user_id.to_string().as_bytes(),
-            &globals.next_count()?.to_be_bytes(),
-        )?;
+        self.userid_lastonetimekeyupdate
+            .insert(&user_id.as_bytes(), &globals.next_count()?.to_be_bytes())?;
 
         Ok(())
     }
@@ -316,7 +314,7 @@ pub fn add_one_time_key(
     #[tracing::instrument(skip(self))]
     pub fn last_one_time_keys_update(&self, user_id: &UserId) -> Result<u64> {
         self.userid_lastonetimekeyupdate
-            .get(&user_id.to_string().as_bytes())?
+            .get(&user_id.as_bytes())?
             .map(|bytes| {
                 utils::u64_from_bytes(&bytes).map_err(|_| {
                     Error::bad_database("Count in roomid_lastroomactiveupdate is invalid.")
@@ -332,18 +330,16 @@ pub fn take_one_time_key(
         key_algorithm: &DeviceKeyAlgorithm,
         globals: &super::globals::Globals,
     ) -> Result<Option<(DeviceKeyId, OneTimeKey)>> {
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         prefix.extend_from_slice(device_id.as_bytes());
         prefix.push(0xff);
         prefix.push(b'"'); // Annoying quotation mark
-        prefix.extend_from_slice(key_algorithm.to_string().as_bytes());
+        prefix.extend_from_slice(key_algorithm.as_ref().as_bytes());
         prefix.push(b':');
 
-        self.userid_lastonetimekeyupdate.insert(
-            &user_id.to_string().as_bytes(),
-            &globals.next_count()?.to_be_bytes(),
-        )?;
+        self.userid_lastonetimekeyupdate
+            .insert(&user_id.as_bytes(), &globals.next_count()?.to_be_bytes())?;
 
         self.onetimekeyid_onetimekeys
             .scan_prefix(&prefix)
@@ -373,7 +369,7 @@ pub fn count_one_time_keys(
         user_id: &UserId,
         device_id: &DeviceId,
     ) -> Result<BTreeMap<DeviceKeyAlgorithm, UInt>> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -409,7 +405,7 @@ pub fn add_device_keys(
         rooms: &super::rooms::Rooms,
         globals: &super::globals::Globals,
     ) -> Result<()> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -434,7 +430,7 @@ pub fn add_cross_signing_keys(
     ) -> Result<()> {
         // TODO: Check signatures
 
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
 
         // Master key
@@ -532,9 +528,9 @@ pub fn sign_key(
         rooms: &super::rooms::Rooms,
         globals: &super::globals::Globals,
     ) -> Result<()> {
-        let mut key = target_id.to_string().as_bytes().to_vec();
+        let mut key = target_id.as_bytes().to_vec();
         key.push(0xff);
-        key.extend_from_slice(key_id.to_string().as_bytes());
+        key.extend_from_slice(key_id.as_bytes());
 
         let mut cross_signing_key =
             serde_json::from_slice::<serde_json::Value>(&self.keyid_key.get(&key)?.ok_or(
@@ -617,14 +613,14 @@ fn mark_device_key_update(
                 continue;
             }
 
-            let mut key = room_id.to_string().as_bytes().to_vec();
+            let mut key = room_id.as_bytes().to_vec();
             key.push(0xff);
             key.extend_from_slice(&count);
 
             self.keychangeid_userid.insert(key, &*user_id.to_string())?;
         }
 
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(&count);
         self.keychangeid_userid.insert(key, &*user_id.to_string())?;
@@ -637,7 +633,7 @@ pub fn get_device_keys(
         user_id: &UserId,
         device_id: &DeviceId,
     ) -> Result<Option<DeviceKeys>> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(device_id.as_bytes());
 
@@ -724,7 +720,7 @@ pub fn add_to_device_event(
         content: serde_json::Value,
         globals: &super::globals::Globals,
     ) -> Result<()> {
-        let mut key = target_user_id.to_string().as_bytes().to_vec();
+        let mut key = target_user_id.as_bytes().to_vec();
         key.push(0xff);
         key.extend_from_slice(target_device_id.as_bytes());
         key.push(0xff);
@@ -751,7 +747,7 @@ pub fn get_to_device_events(
     ) -> Result<Vec<Raw<AnyToDeviceEvent>>> {
         let mut events = Vec::new();
 
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         prefix.extend_from_slice(device_id.as_bytes());
         prefix.push(0xff);
@@ -773,7 +769,7 @@ pub fn remove_to_device_events(
         device_id: &DeviceId,
         until: u64,
     ) -> Result<()> {
-        let mut prefix = user_id.to_string().as_bytes().to_vec();
+        let mut prefix = user_id.as_bytes().to_vec();
         prefix.push(0xff);
         prefix.extend_from_slice(device_id.as_bytes());
         prefix.push(0xff);
@@ -808,7 +804,7 @@ pub fn update_device_metadata(
         device_id: &DeviceId,
         device: &Device,
     ) -> Result<()> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -831,7 +827,7 @@ pub fn get_device_metadata(
         user_id: &UserId,
         device_id: &DeviceId,
     ) -> Result<Option<Device>> {
-        let mut userdeviceid = user_id.to_string().as_bytes().to_vec();
+        let mut userdeviceid = user_id.as_bytes().to_vec();
         userdeviceid.push(0xff);
         userdeviceid.extend_from_slice(device_id.as_bytes());
 
@@ -845,7 +841,7 @@ pub fn get_device_metadata(
     }
 
     pub fn all_devices_metadata(&self, user_id: &UserId) -> impl Iterator<Item = Result<Device>> {
-        let mut key = user_id.to_string().as_bytes().to_vec();
+        let mut key = user_id.as_bytes().to_vec();
         key.push(0xff);
 
         self.userdeviceid_metadata