| 1 | <head>
|
|---|
| 2 | <title>Bloom::Filter in JavaScript</title>
|
|---|
| 3 | </head>
|
|---|
| 4 | <style type="text/css">
|
|---|
| 5 | h1{
|
|---|
| 6 | font-size: 120%;
|
|---|
| 7 | margin : 0px;
|
|---|
| 8 | padding : 0;
|
|---|
| 9 | }
|
|---|
| 10 | h2 {
|
|---|
| 11 | font-size: 100%;
|
|---|
| 12 | margin:0;
|
|---|
| 13 | padding : 5px;
|
|---|
| 14 | }
|
|---|
| 15 | #result {
|
|---|
| 16 | color:red;
|
|---|
| 17 | font-weight: bold;
|
|---|
| 18 | }
|
|---|
| 19 | textarea {
|
|---|
| 20 | width: 100%;
|
|---|
| 21 | height : 20em;
|
|---|
| 22 | }
|
|---|
| 23 | </style>
|
|---|
| 24 | <script type="text/javascript" src="bloomfilter.js"></script>
|
|---|
| 25 |
|
|---|
| 26 | <h1>Bloom::Filter in JavaScript</h1>
|
|---|
| 27 | <h2>demo</h2>
|
|---|
| 28 | <button onclick="initialize()">initialize</button>
|
|---|
| 29 | <input type="text" id="key">
|
|---|
| 30 | <button onclick="add()">add</button>
|
|---|
| 31 | <button onclick="check()">check</button>
|
|---|
| 32 | <span id="result"></span>
|
|---|
| 33 | <h2>check</h2>
|
|---|
| 34 | <textarea id="check"></textarea>
|
|---|
| 35 | <h2>filter</h2>
|
|---|
| 36 | <textarea id="filter" wrap="soft"></textarea>
|
|---|
| 37 | <script type="text/javascript">
|
|---|
| 38 | var bf;
|
|---|
| 39 | BloomFilter.TRUE = "o";
|
|---|
| 40 | BloomFilter.FALSE = "-";
|
|---|
| 41 |
|
|---|
| 42 | function $(id){return document.getElementById(id)}
|
|---|
| 43 | function initialize(){
|
|---|
| 44 | bf = new BloomFilter();
|
|---|
| 45 | update_view();
|
|---|
| 46 | }
|
|---|
| 47 | function check(){
|
|---|
| 48 | if(!bf) output_error("not initialized!");
|
|---|
| 49 | var key = $("key").value;
|
|---|
| 50 | var r = bf.check(key);
|
|---|
| 51 | $("result").innerHTML = r;
|
|---|
| 52 | update_cell(key);
|
|---|
| 53 | }
|
|---|
| 54 | function add(){
|
|---|
| 55 | if(!bf) output_error("not initialized!");
|
|---|
| 56 | var key = $("key").value;
|
|---|
| 57 | bf.add(key);
|
|---|
| 58 | update_cell(key);
|
|---|
| 59 | update_view();
|
|---|
| 60 | }
|
|---|
| 61 | function output_error(str){
|
|---|
| 62 | $("result").innerHTML = str;
|
|---|
| 63 | }
|
|---|
| 64 | function update_cell(key){
|
|---|
| 65 | var cells = bf._get_cells(key);
|
|---|
| 66 | var check_bit = new Array(bf.filter_length);
|
|---|
| 67 | for(var i=0;i<bf.filter_length;i++) check_bit[i] = BloomFilter.FALSE;
|
|---|
| 68 | for(var i=0;i<cells.length;i++) check_bit[cells[i]] = BloomFilter.TRUE;
|
|---|
| 69 | $("check").value = check_bit.splitby(100).join("\n");
|
|---|
| 70 | }
|
|---|
| 71 |
|
|---|
| 72 | function update_view(){
|
|---|
| 73 | var check_bit = new Array(bf.filter_length);
|
|---|
| 74 | for(var i=0;i<bf.filter_length;i++) check_bit[i] = BloomFilter.FALSE;
|
|---|
| 75 | for(var i=0;i<bf.filter_length;i++) {
|
|---|
| 76 | if (bf.is_bit_on(i)) {
|
|---|
| 77 | check_bit[i] = BloomFilter.TRUE;
|
|---|
| 78 | }
|
|---|
| 79 | }
|
|---|
| 80 | $("filter").value = check_bit.splitby(100).join("\n");
|
|---|
| 81 | }
|
|---|
| 82 | Array.prototype.splitby = function(num){
|
|---|
| 83 | var result = [];
|
|---|
| 84 | for(var i=0;i<this.length;i+=num){
|
|---|
| 85 | result.push(this.slice(i, i+num).join(""));
|
|---|
| 86 | }
|
|---|
| 87 | return result;
|
|---|
| 88 | }
|
|---|
| 89 | </script>
|
|---|
| 90 |
|
|---|
| 91 | <h2>Usage</h2>
|
|---|
| 92 | <pre>
|
|---|
| 93 | var bf = new BloomFilter();
|
|---|
| 94 | bf.add("key_a");
|
|---|
| 95 | bf.check("key_a"); // true
|
|---|
| 96 | bf.check("key_b"); // false
|
|---|
| 97 | </pre>
|
|---|