Swift:从字符串获取唯一的整数ID

3
我正在使用Parse,它在数据库中有一个预加载的User表。我想从每个用户那里得到一个唯一的userId(Int)。Parse的objectId是唯一的,但不是Int,而username是一个字符串。每个用户的用户名都是唯一的,所以我能否将每个用户名转换为数字?
我尝试了.toInt(),Int(),但什么也没得到。
为什么:
我有一个现有的用户评分(电影)表,我想用更多的评分来扩展这个表。userId字段是一个数字值,所以我必须保持它这样。

你不能将随机字符串转换为整数并保持唯一性。你能解释一下为什么需要整数标识符吗? - undefined
你能提供一些例子吗?例如 input => output - undefined
你应该使用指针来实现这个功能。 - undefined
2个回答

8

Swift String具有hash属性。它还符合Hashable协议。也许你可以使用它。

然而,hashValue具有以下注释:

Axiom:x == y意味着x.hashValue == y.hashValue。

注意:散列值无法保证在同一程序的不同调用之间保持稳定。不要在程序运行期间持久化散列值。

因此,请谨慎使用...

注意:正如评论中所述,hashValue不能保证是唯一的,但冲突应该很少发生,因此它可能仍然是一个解决方案。


我也同意对这个问题的评论:“为什么?” - undefined
@MartinR 这是正确的,但碰撞应该很少发生,也许对于预期的使用来说已经足够了。 - undefined
@danh 实际上,情况正好相反... 给定两个不同的哈希值,字符串肯定是不同的。但是两个不同的字符串可能生成相同的哈希值... 再次强调,这种情况应该不会经常发生,所以也许hashValue可以使用。 - undefined
@MarcosCrispino:这样的说法需要我们知道Swift字符串的哈希属性是如何实现的。这可能是真的,但是我不知道。(例如,NSArray的hashValue属性只返回元素的数量 :) - undefined

3
拥有唯一的任意字符串到整数的映射是不可能的。您需要对允许的字符和字符串长度进行一些限制。然而,即使您使用大小写不敏感的字母数字用户名,并采用一些智能的可变长度位编码,那么每个字符大约要看5个比特位。64位整数可以通过这种方式容纳多达12个字符。超过这个长度,您将不可避免地会发生冲突。
我认为您从错误的角度解决了问题。与其拥有一个字符串到整数映射的函数,不如拥有一个独立的Int <=> String映射表。只需具备某些功能来检查该表中是否存在userID,如果不存在,则插入一个新记录并为该userID分配一个新的唯一编号。这样,需要相当长的时间和服务流行度才能耗尽64位整数的容量。

刚刚正在写同样的内容。int64范围是2^64,而字符串,即使只是ASCII字符串,表达能力更强,可以说是2^(7*长度)。为了确保唯一的ID,你需要将较小的空间(整数)映射到较大的空间(字符串)。 - undefined
他正在生成一个固定大小的用户ID。总会有可能发生冲突,但这并不重要。他只需要在使用之前检查是否有冲突即可。按照你的建议做并不能满足他的需求。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接