【问题标题】:Reversible Hashed to convert integer ID to alphabets/alphanumeric可逆散列将整数 ID 转换为字母/字母数字
【发布时间】:2021-08-03 17:01:19
【问题描述】:

我需要一个快速的 Delphi 可逆散列 ID 函数。

  • 简短、模糊且高效的 ID
  • 无冲突(至少不超过 32 位无符号整数)
  • 可逆
  • 快速
  • 最好是有输入键的东西,所以它可以随机化一点... 否则,在我的所有软件模块上,“3”将始终为 23zkJ5。
  • 跨平台工作

类似于 Youtube 的视频标识符。

Encode(3); // => "23zkJ5"
Decode('23zkJ5'); // => 3

PHP 似乎有不少这样的;我找不到 Delphi 的。

我看了这个,但不是我真正想要的,另外我需要 Delphi 中的一些东西。

Reversible hash function?

$generator->encode(6); // => "43Vht7"
$generator->decode('43Vht7'); // => 6

我需要类似 PHP 提供的东西:

https://github.com/delight-im/PHP-IDs

我不能使用 MD5,因为它不可逆;使用密码箱加密/解密似乎有点过头了? (如果真的没有选择,Lockbox 中的哪种算法是最好的选择?)

【问题讨论】:

  • 您不是在寻找哈希,而是在寻找加密。有很多 Delphi 源代码。 StackOverflow 不是要求推荐库或组件的地方。
  • 好的,因为这个 php 称它为“可逆哈希”...我尝试了一些加密,但它不坚持字母数字字符...base64 在它变得太长之后,所以我只是想知道是否有人有一个快速简单的例程。
  • 旧的 XOR 算法加上一些排列。这是完全可逆且易于实现的(当然也可以破解)。
  • 如果您想保持相同的字符集,请查看Format Preserving Encryption。开始工作有点麻烦,但应该做你想做的。
  • "但它不坚持字母数字字符" - 哈希也是如此,那你的意思是什么?如果“可逆散列”是可能的,那么您还可以告诉我我的总和 42 是否来自总和 1527-850。但是,总和不能反转为它们的总和。

标签: algorithm delphi hash


【解决方案1】:

使用 AES 并将密码字节数组转换为十六进制字符串或 Base64。

代码示例见这里

AES encrypt string in Delphi (10 Seattle) with DCrypt, decrypt with PHP/OpenSSL

【讨论】:

  • 感谢您的回复。我只是想知道一些例程如何用这么短的代码来做到这一点,例如 Youtube 有 11 个字符长,而几个 PHP 例程甚至更少。我只需要满足 32 位数字(40 亿 + 数字)。
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多