-## Copyright 2002-2003 Andrew Loewenstern, All Rights Reserved
-# see LICENSE.txt for license information
"""Some utitlity functions for use in apt-p2p's khashmir DHT."""
from twisted.trial import unittest
+from khash import HASH_LENGTH
+
def bucket_stats(l):
"""Given a list of khashmir instances, finds min, max, and average number of nodes in tables."""
max = avg = 0
def count(buckets):
c = 0
for bucket in buckets:
- c = c + len(bucket.l)
+ c = c + bucket.len()
return c
for node in l:
c = count(node.table.buckets)
@return: the node ID, IP address and port to contact the node on
@raise ValueError: if the compact representation doesn't exist
"""
- if (len(s) != 26):
+ if (len(s) != HASH_LENGTH+6):
raise ValueError
- id = s[:20]
- host = '.'.join([str(ord(i)) for i in s[20:24]])
- port = (ord(s[24]) << 8) | ord(s[25])
+ id = s[:HASH_LENGTH]
+ host = '.'.join([str(ord(i)) for i in s[HASH_LENGTH:(HASH_LENGTH+4)]])
+ port = (ord(s[HASH_LENGTH+4]) << 8) | ord(s[HASH_LENGTH+5])
return {'id': id, 'host': host, 'port': port}
def compact(id, host, port):
raise ValueError
return s
+def byte_format(s):
+ """Format a byte size for reading by the user.
+
+ @type s: C{long}
+ @param s: the number of bytes
+ @rtype: C{string}
+ @return: the formatted size with appropriate units
+ """
+ if (s < 1):
+ r = str(int(s*1000.0)/1000.0) + 'B'
+ elif (s < 10):
+ r = str(int(s*100.0)/100.0) + 'B'
+ elif (s < 102):
+ r = str(int(s*10.0)/10.0) + 'B'
+ elif (s < 1024):
+ r = str(int(s)) + 'B'
+ elif (s < 10485):
+ r = str(int((s/1024.0)*100.0)/100.0) + 'KiB'
+ elif (s < 104857):
+ r = str(int((s/1024.0)*10.0)/10.0) + 'KiB'
+ elif (s < 1048576):
+ r = str(int(s/1024)) + 'KiB'
+ elif (s < 10737418L):
+ r = str(int((s/1048576.0)*100.0)/100.0) + 'MiB'
+ elif (s < 107374182L):
+ r = str(int((s/1048576.0)*10.0)/10.0) + 'MiB'
+ elif (s < 1073741824L):
+ r = str(int(s/1048576)) + 'MiB'
+ elif (s < 1099511627776L):
+ r = str(int((s/1073741824.0)*100.0)/100.0) + 'GiB'
+ else:
+ r = str(int((s/1099511627776.0)*100.0)/100.0) + 'TiB'
+ return(r)
+
class TestUtil(unittest.TestCase):
"""Tests for the utilities."""