php数字混淆

可以将mysql自增的ID混淆成其他数字或者字符,并反解回来 类很小,使用方法也很简单 支持加盐,而且不论原始ID长短都输出固定的长度

/**
 * Opaque ID encoder.
 *
 * Translates between 32-bit integers (such as resource IDs) and obfuscated
 * scrambled values, as a one-to-one mapping. Supports hex and base64 url-safe
 * string representations. Expects a secret integer key in the constructor.
 *
 * (c) 2011 Marek Z. @marekweb
 */
class OpaqueEncoder {
  private $key;
  private $extraChars = '.-';
  private $encoding;

  const ENCODING_INT = 0;
  const ENCODING_HEX = 1;
  const ENCODING_BASE64 = 2;

  /**
   * @param $key Secret key used for lightweight encryption.
   */
  public function __construct($key, $encoding = self::ENCODING_HEX) {
    $this->key = $key;
    $this->encoding = $encoding;
  }

  /**
   * Produce an integer hash of a 16-bit integer, returning a transformed 16-bit integer.
   */
  protected function transform($i) {
    $i = ($this->key ^ $i) * 0x9e3b;
    return $i >> ($i & 0xf) & 0xffff;
  }

  /**
   * Reversibly transcode a 32-bit integer to a scrambled form, returning a new 32-bit integer.
   */
  public function transcode($i) {
    $r = $i & 0xffff;
    $l = $i >> 16 & 0xffff ^ $this->transform($r);
    return (($r ^ $this->transform($l)) << 16) + $l;
  }

  /**
   * Encode a value according to the encoding mode selected upon instantiation.
   */
  public function encode($i) {
    switch ($this->encoding) {
      case self::ENCODING_INT:
        return $this->transcode($i);

      case self::ENCODING_BASE64:
        return $this->encodeBase64($i);

      case self::ENCODING_HEX:
      default:
        return $this->encodeHex($i);
    }
  }
  /**
   * Decode a value according to the encoding mode selected upon instantiation.
   */
  public function decode($s) {
    switch ($this->encoding) {
      case self::ENCODING_INT:
        return $this->transcode($s);

      case self::ENCODING_BASE64:
        return $this->decodeBase64($s);

      case self::ENCODING_HEX:
      default:
        return $this->decodeHex($s);
    }
  }

  /**
   * Transcode an integer and return it as an 8-character hex string.
   */
  public function encodeHex($i) {
    return dechex($this->transcode($i));
  }

  /**
   * Transcode an integer and return it as a 6-character base64 string.
   */
  public function encodeBase64($i) {
    return strtr(substr(base64_encode(pack('N', $this->transcode($i))), 0, 6), '+/', $this->extraChars);
  }

  /**
   * Decode an 8-character hex string, returning the original integer.
   */
  public function decodeHex($s) {
    return $this->transcode(hexdec($s));
  }

  /**
   * Decode a 6-character base64 string, returning the original integer.
   */
  public function decodeBase64($s) {
    $unpacked = unpack('N', base64_decode(strtr($s, $this->extraChars, '+/')));
    return $this->transcode($unpacked[1]);
  }
}

调用方法:

require "OpaqueEncoder.php";
$key = 1024;
$encoder1 = new OpaqueEncoder($key, OpaqueEncoder::ENCODING_HEX);
$encoder2 = new OpaqueEncoder($key, OpaqueEncoder::ENCODING_BASE64);
$encoder3 = new OpaqueEncoder($key, OpaqueEncoder::ENCODING_INT);
echo $encoder1->encode(1); //cf334f31
echo $encoder2->encode(1); //zzNPMQ
echo $encoder3->encode(1); //3476246321

地址