我有一个SQL表,它使用字符串作为键。我需要使用PHP将该字符串(最多18个字符)转换为唯一的(!)4字节整数。有人能帮忙吗?
唯一?不可能,抱歉。
让我们仔细看看:
对于18个字符,即使我们假设ASCII(7位)只有128个可能的字符,你也会得到128^18个可能的字符串(我甚至不讨论更短字符串的可能性!),大约是8E37(8和37个零)。
对于一个4字节的整数,你会得到256^4个可能的整数,大约是4E9(40亿)。
所以,你的字符串比你的整数多4E28;不能有唯一的映射。
因此,一旦输入4294967297键,肯定会遇到碰撞,但一旦输入多个键,也可能会遇到碰撞。
另请参阅:http://en.wikipedia.org/wiki/Pigeonhole_principle
保留一个字符串到整数的查找表。每次遇到新字符串时,您都会将其添加到映射表中,并为其分配一个新的唯一ID。这将适用于大约2^32个字符串,这可能已经足够了。
对于超过2^32个不同的字符串,没有办法做到这一点。
你不能。一个四字节的整数可以表示2^32=40亿个值,这不足以容纳目标空间。
如果当前表中的行数少于40亿,则可以创建一个只为每个行分配一个增量值的交叉表。使用这种方法,您将被限制为40亿行,但这可能适合您的情况。