Skip to content

Instantly share code, notes, and snippets.

@xeoncross
Forked from baldurrensch/feistel.php
Created September 13, 2012 16:05
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save xeoncross/3715367 to your computer and use it in GitHub Desktop.
Feistel Hash
<?php
/**
* This function computes a hash of an integer. This can be used to not expose values to a customer, such as
* not giving them the id value for passing them to URLs. This algorithm is a bidirectional encryption (Feistel cipher) that maps
* the integer space onto itself.
*
* @link http://wiki.postgresql.org/wiki/Pseudo_encrypt Algorithm used
* @link http://en.wikipedia.org/wiki/Feistel_cipher Wikipedia page about Feistel ciphers
* @param int $value
* @return int
* @author Baldur Rensch <brensch@gmail.com>
*/
function computeHash($value)
{
$l1 = ($value >> 16) & 65535;
$r1 = $value & 65535;
for ($i = 0; $i < 3; $i++) {
$l2 = $r1;
$r2 = $l1 ^ (int) ((((1366 * $r1 + 150889) % 714025) / 714025) * 32767);
$l1 = $l2;
$r1 = $r2;
}
return ($r1 << 16) + $l1;
}
// Test Run
$numbers = array(
-PHP_INT_MAX,
-56578,
-232,
-34,
-1,
0,
1,
34,
232,
56578,
9999999999,
PHP_INT_MAX,
9999999999999999999999999999, // "0"
);
foreach($numbers as $number)
{
print $number . ' = ' . computeHash($number). "\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment