【问题标题】:How to convert numbers to an alpha numeric system with php如何使用 php 将数字转换为字母数字系统
【发布时间】:2010-06-06 18:20:38
【问题描述】:

我不确定这叫什么,这就是为什么我无法搜索它。

我要做的是获取数字并将它们转换为一些字母数字基数,这样数字,比如 5000,就不会读作“5000”,而是读作“G4u”或类似的东西。这个想法是为了节省空间,也不会让给定系统中有多少记录一目了然。我正在使用 php,所以如果 php 中内置了类似的东西会更好,但此时即使是此方法的名称也会有所帮助。

再次,抱歉不能更清楚,我只是不确定这叫什么。

【问题讨论】:

标签: php


【解决方案1】:

您想将数字的底数更改为以 10 为底的值(我认为您想要以 36 为底,因为它使用整个字母表和数字 0 - 9)。

内置的base_convert 函数可能会有所帮助,尽管它确实有限制,它只能在基数 2 和 36 之间转换

$number = '5000';
echo base_convert($number, 10, 36); //3uw

【讨论】:

  • @Patrick 这也是我要走的路。请记住,您并没有真正通过隐藏数字来隐藏/保护站点中的任何内容。任何人都可以很容易地发现您正在对数字进行 base36 处理。但这将是要走的路。此处的代码示例:tonymarston.net/php-mysql/converter.html
  • 并且 base_covert 的 PHP 文档有一个注释“将 int 转换为任何基数的简单函数”。这样我可以将其扩展为将 a-z 和 A-Z 视为不同的情况,给我 62 个地区选项而不是 36 个。
【解决方案2】:

有趣的是,我昨天问了the exact opposite question

首先想到的是将十进制数转换为hexadecimal。 5000 会变成1388,10000 会变成2710。将在这里和那里节省几个字节。

您还可以使用更高的基数,利用完整的字母表(0-Z 而不是 0-F)甚至完整的 256 个 ASCII 字符。正如@Yacoby 指出的那样,您可以使用base_convert()

正如我在评论中所说,请记住,这不是屏蔽 ID 的有效方法。如果人们可以猜测记录的下一个或上一个 ID 时您遇到了安全问题,那么这是非常糟糕的保护。

【讨论】:

  • 没有安全隐患,只是装饰性的,base_convert 是看起来可行的答案。感谢大家的帮助和洞察力!
  • php.net/manual/en/function.base-convert.php#105990 还允许扩展使用的字符数量,例如大写字符。
  • 虽然一个 byte 可以表示 256 个可能的值,但 ASCII 只有 128 个字符。
【解决方案3】:

dechex 将为您将数字转换为十六进制。但是,它不会混淆给定系统中有多少记录。我认为它也不会提高存储或节省空间的效率。

如果需要混淆,您可能希望使用 2 路 crypt 函数。这也不会节省空间。

请更清楚地说明你的目标并提供更多背景信息,因为这似乎有点毫无意义。

【讨论】:

    【解决方案4】:

    这可能会让更多的人感到困惑,而不是简单地转换数字的基数......

    尝试使用带符号的数字来表示您的号码。例如,不要将数字 0..9 用于十进制数,而是使用数字 -5..5。 Wikipedia article 给出了数字二进制表示的示例,但该方法可用于任何数字基数。

    将它与 base-36 算术结合使用可能会让您满意。

    【讨论】:

      【解决方案5】:

      编辑:这个答案并不是问题的真正解决方案,所以除非你试图散列一个数字,否则请忽略它。

      我的第一个想法是我们使用例如散列它。 md5sha1。 (虽然你可能不会节省任何空间......)

      为了防止人们使用rainbow-tablesbrute force 来猜测您散列的数字,您可以随时添加salt。它可以像在散列之前附加到您的号码的字符串一样简单。

      md5 将返回正好 32 个字符的字母数字字符串,而 sha1 将返回 40 个字符之一。

      【讨论】:

      • 他显然仍然知道原来的号码是多少。这个想法是为了节省磁盘空间,所以它需要是可逆的。
      • 嗯,这不会节省任何空间(实际上相反),您将无法从哈希中取回原始数字。
      • 抱歉,我误会了他的意思。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2013-09-03
      相关资源
      最近更新 更多