Skip to content

Instantly share code, notes, and snippets.

@pachanka
Created June 22, 2016 01:17
Show Gist options
  • Save pachanka/ac72db6cf8c0ce5dc312fccccf9d7a0a to your computer and use it in GitHub Desktop.
Save pachanka/ac72db6cf8c0ce5dc312fccccf9d7a0a to your computer and use it in GitHub Desktop.
A method object to create crytographically safe seeds and strings.
/* I MADE THIS, I THINK ITS AWESOME */
/* Seed generation and shuffle */
var Seed_int = 0;
var Seed_str = '';
var Seed = {
/* Generate a random number, or perpetuate
a pseudo-random seed if it is provided. */
random_int : function(seed_int){
var rand = 0;
if(typeof seed_int == 'number'){
// A linear congruential generator
var multiplier = 1103515245;
var increment = 12345;
var modulus = Math.pow(2, 31); // 2^31
rand = ((multiplier * seed_int + increment) % modulus );
//seed_int++;
}else{
// Create seed
if(typeof window.crypto !== 'undefined'
&& typeof window.crypto.getRandomValues === 'function'){
// Sweeet crypto API
var rand_arr = new Uint32Array(1);
window.crypto.getRandomValues(rand_arr);
rand = rand_arr[0];
}else{
// Insecure!
rand = Math.floor(Math.random() * 10000000000);
}
}
return rand;
},
/* Can generate an integer from a string. */
int_from_string : function(str){
var hash = 0;
var len = str.length;
if (len == 0) return hash;
for (i = 0; i < len; i++) {
var ch = str.charCodeAt(i);
hash = ( (hash << 5) - hash) + ch;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
},
/*
- len is desired string length
- corpus is the available characters to construct the output
- seed is a number */
string_from_seed : function(len, corpus, seed){
var text = '';
// Make sure corpus is at len lenght.
if(len > corpus.length){
for (var i = 0; i < len; i++) {
corpus += corpus.charAt(i);
};
}
return Seed.shuffle_string(corpus, seed).substring(0, len);
},
/*
- corpus: the string to shuffle
- seed: is an integer */
shuffle_string : function(corpus, seed) {
var a = corpus.split(''),
n = a.length;
for(var i = n - 1; i > 0; i--) {
var j = Seed.random_int(seed) % (i + 1);
var tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
return a.join('');
},
/* reset seed globals */
reset_seed : function(){
Seed_int = 0;
Seed_str = '';
},
set_seed : function(seed_obj){
Seed_str = seed_obj.str;
Seed_int = seed_obj.int;
return seed_obj;
},
make_seed_str : function(len,corpus){
//Seed.reset_seed();
return Seed.string_from_seed(len, corpus, Seed.random_int());
},
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment