<?php
/**
* @link http://stackoverflow.com/questions/9999290/write-a-function-generatepassword-which-accepts-two-arguments-an-integer-and-a
*/
/**
* Generate a password N characters long consisting of characters
*
* @param int $size
* @param string $characters
* @param callback $random (optional) source of random, a function with two parameters, from and to
* @return string|NULL password
*/
function generate_password($size, $characters, $random = 'rand') {
// validate $size input
$size = (int) $size;
if ($size <= 0) {
trigger_error(sprintf('Can not create a password of size %d. [%s]', $size, __FUNCTION__), E_USER_WARNING); return NULL;
}
if ($size > 255) {
trigger_error(sprintf('Refused to create a password of size %d as this is larger than 255. [%s]', $size, __FUNCTION__), E_USER_WARNING); return NULL;
}
// normalize $characters input, remove duplicate characters
// validate number of characters
$length = strlen($characters); if ($length < 1) {
trigger_error(sprintf('Can not create a random password out of %d character(s). [%s]', $length, __FUNCTION__), E_USER_WARNING); return NULL;
}
// initialize the password result
// get the number of characters minus one
// your string of characters actually begins at 0 and ends on the
// string-length - 1:
// $characters[0] = 'a'
// $characters[1] = 'b'
// $characters[2] = 'c'
$length--;
// get one random character per each place in the password
while ($size--)
{
// generate a random number between 0 and $length (including)
$randomValue = $random(0, $length);
// that random number is used to turn the number into a character
$character = $characters[$randomValue];
// set the random character
$password[$size] = $character;
}
// return the result
return $password;
}
echo generate_password(5, 'abc0123');
PD9waHAKLyoqCiAqIEBsaW5rIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTk5OTI5MC93cml0ZS1hLWZ1bmN0aW9uLWdlbmVyYXRlcGFzc3dvcmQtd2hpY2gtYWNjZXB0cy10d28tYXJndW1lbnRzLWFuLWludGVnZXItYW5kLWEKICovCgoKLyoqCiAqIEdlbmVyYXRlIGEgcGFzc3dvcmQgTiBjaGFyYWN0ZXJzIGxvbmcgY29uc2lzdGluZyBvZiBjaGFyYWN0ZXJzCiAqCiAqIEBwYXJhbSBpbnQgJHNpemUKICogQHBhcmFtIHN0cmluZyAkY2hhcmFjdGVycwogKiBAcGFyYW0gY2FsbGJhY2sgJHJhbmRvbSAob3B0aW9uYWwpIHNvdXJjZSBvZiByYW5kb20sIGEgZnVuY3Rpb24gd2l0aCB0d28gcGFyYW1ldGVycywgZnJvbSBhbmQgdG8KICogQHJldHVybiBzdHJpbmd8TlVMTCBwYXNzd29yZAogKi8KZnVuY3Rpb24gZ2VuZXJhdGVfcGFzc3dvcmQoJHNpemUsICRjaGFyYWN0ZXJzLCAkcmFuZG9tID0gJ3JhbmQnKSB7CgogICAgLy8gdmFsaWRhdGUgJHNpemUgaW5wdXQKICAgICRzaXplID0gKGludCkgJHNpemU7CgogICAgaWYgKCRzaXplIDw9IDApIHsKICAgICAgICB0cmlnZ2VyX2Vycm9yKHNwcmludGYoJ0NhbiBub3QgY3JlYXRlIGEgcGFzc3dvcmQgb2Ygc2l6ZSAlZC4gWyVzXScsICRzaXplLCBfX0ZVTkNUSU9OX18pLCBFX1VTRVJfV0FSTklORyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKCRzaXplID4gMjU1KSB7CiAgICAgICAgdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdSZWZ1c2VkIHRvIGNyZWF0ZSBhIHBhc3N3b3JkIG9mIHNpemUgJWQgYXMgdGhpcyBpcyBsYXJnZXIgdGhhbiAyNTUuIFslc10nLCAkc2l6ZSwgX19GVU5DVElPTl9fKSwgRV9VU0VSX1dBUk5JTkcpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8vIG5vcm1hbGl6ZSAkY2hhcmFjdGVycyBpbnB1dCwgcmVtb3ZlIGR1cGxpY2F0ZSBjaGFyYWN0ZXJzCiAgICAkY2hhcmFjdGVycyA9IGNvdW50X2NoYXJzKCRjaGFyYWN0ZXJzLCAzKTsKCiAgICAvLyB2YWxpZGF0ZSBudW1iZXIgb2YgY2hhcmFjdGVycwogICAgJGxlbmd0aCA9IHN0cmxlbigkY2hhcmFjdGVycyk7CiAgICBpZiAoJGxlbmd0aCA8IDEpIHsKICAgICAgICB0cmlnZ2VyX2Vycm9yKHNwcmludGYoJ0NhbiBub3QgY3JlYXRlIGEgcmFuZG9tIHBhc3N3b3JkIG91dCBvZiAlZCBjaGFyYWN0ZXIocykuIFslc10nLCAkbGVuZ3RoLCBfX0ZVTkNUSU9OX18pLCBFX1VTRVJfV0FSTklORyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLy8gaW5pdGlhbGl6ZSB0aGUgcGFzc3dvcmQgcmVzdWx0CiAgICAkcGFzc3dvcmQgPSBzdHJfcmVwZWF0KCJceDAwIiwgJHNpemUpOwoKICAgIC8vIGdldCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgbWludXMgb25lCiAgICAvLyB5b3VyIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IGJlZ2lucyBhdCAwIGFuZCBlbmRzIG9uIHRoZQogICAgLy8gc3RyaW5nLWxlbmd0aCAtIDE6CiAgICAvLyAgICRjaGFyYWN0ZXJzWzBdID0gJ2EnCiAgICAvLyAgICRjaGFyYWN0ZXJzWzFdID0gJ2InCiAgICAvLyAgICRjaGFyYWN0ZXJzWzJdID0gJ2MnCiAgICAkbGVuZ3RoLS07CgogICAgLy8gZ2V0IG9uZSByYW5kb20gY2hhcmFjdGVyIHBlciBlYWNoIHBsYWNlIGluIHRoZSBwYXNzd29yZAogICAgd2hpbGUgKCRzaXplLS0pCiAgICB7CiAgICAgICAgLy8gZ2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gMCBhbmQgJGxlbmd0aCAoaW5jbHVkaW5nKQogICAgICAgICRyYW5kb21WYWx1ZSA9ICRyYW5kb20oMCwgJGxlbmd0aCk7CiAgICAgICAgLy8gdGhhdCByYW5kb20gbnVtYmVyIGlzIHVzZWQgdG8gdHVybiB0aGUgbnVtYmVyIGludG8gYSBjaGFyYWN0ZXIKICAgICAgICAkY2hhcmFjdGVyID0gJGNoYXJhY3RlcnNbJHJhbmRvbVZhbHVlXTsKICAgICAgICAvLyBzZXQgdGhlIHJhbmRvbSBjaGFyYWN0ZXIKICAgICAgICAkcGFzc3dvcmRbJHNpemVdID0gJGNoYXJhY3RlcjsKICAgIH0KCiAgICAvLyByZXR1cm4gdGhlIHJlc3VsdAogICAgcmV0dXJuICRwYXNzd29yZDsKfQoKCmVjaG8gZ2VuZXJhdGVfcGFzc3dvcmQoNSwgJ2FiYzAxMjMnKTs=