我需要将任意字母数字ID转换为保证唯一且可逆的整数。有什么很酷的技巧可以做到这一点吗?我已经看过一些哈希函数等,但通常它们不会产生整数输出,或者它们是非唯一的。
例如,假设我有一个ID,例如AX36543TXQ。我需要一个函数来唯一地将它映射到一个整数,这样它就不会与任何其他可能的ID冲突,并且如果需要可以转换回它的字母数字形式。
答案 0 :(得分:0)
避免碰撞是非常困难的,但你可以做类似的事情,如:
首先:创建一个以VARCHAR列为主键的表:
CREATE TABLE `table` (
`pkey` VARCHAR(10) NOT NULL,
`name` TEXT NULL,
`others` TEXT NULL,
PRIMARY KEY (`pkey`));
添加一些数据:
INSERT INTO `table` (`pkey`, `name`, `others`) VALUES ('a', 'Albert', '123');
INSERT INTO `table` (`pkey`, `name`, `others`) VALUES ('b', 'Bernard', '456');
INSERT INTO `table` (`pkey`, `name`, `others`) VALUES ('c', 'Chelsea', '789');
如您所见,列PKEY是主键,而VARCHAR:
DESCRIBE `table`;
现在,根据自动增量将主键更改为另一列:
1º)创建列:
ALTER TABLE `table` ADD COLUMN `new_key` INT;
2º)用一系列整数填充列
SET @i=0;
SET @Count=(SELECT COUNT(*) FROM `table`);
UPDATE `table` SET `new_key` = @Count-(@i:=@i+1)+1;
3º)将新列更改为主键
ALTER TABLE `table` DROP PRIMARY KEY;
ALTER TABLE `table` ADD PRIMARY KEY (`new_key`);
ALTER TABLE SO1 MODIFY COLUMN ID INT AUTO_INCREMENT;
要查看最终结果:
DESCRIBE `table`;
并且,您将拥有要检查的原始“主键”,以及每行具有唯一整数的新主键。
为了适合你的情况,“功能”将是:
select `new_key` from `table` where `pkey` = 'AX36543TXQ';
假设上面的选择结果是'17',你的“反向功能”将是:
select `new_pkey` from `table` where `new_key` = 17;