mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	find * -type f "-(" -name "*.bdf" -o -name "*.c" -o -name "*.h" -o -name "*.py" -o -name "*.rst" -o -name "*.txt" "-)" -exec sed -e "s/[[:space:]]*$//" -i {} \;
		
	
			
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # brute-force search for access descriptor hash table
 | |
| 
 | |
| import random
 | |
| 
 | |
| modes = [
 | |
|     "1",
 | |
|     "L", "LA",
 | |
|     "I", "I;16", "I;16L", "I;16B", "I;32L", "I;32B",
 | |
|     "F",
 | |
|     "P", "PA",
 | |
|     "RGB", "RGBA", "RGBa", "RGBX",
 | |
|     "CMYK",
 | |
|     "YCbCr",
 | |
|     ]
 | |
| 
 | |
| def hash(s, i):
 | |
|     # djb2 hash: multiply by 33 and xor character
 | |
|     for c in s:
 | |
|         i = (((i<<5) + i) ^ ord(c)) & 0xffffffff
 | |
|     return i
 | |
| 
 | |
| def check(size, i0):
 | |
|     h = [None] * size
 | |
|     for m in modes:
 | |
|         i = hash(m, i0)
 | |
|         i = i % size
 | |
|         if h[i]:
 | |
|             return 0
 | |
|         h[i] = m
 | |
|     return h
 | |
| 
 | |
| min_start = 0
 | |
| 
 | |
| # 1) find the smallest table size with no collisions
 | |
| for min_size in range(len(modes), 16384):
 | |
|     if check(min_size, 0):
 | |
|         print(len(modes), "modes fit in", min_size, "slots")
 | |
|         break
 | |
| 
 | |
| # 2) see if we can do better with a different initial value
 | |
| for i0 in range(65556):
 | |
|     for size in range(1, min_size):
 | |
|         if check(size, i0):
 | |
|             if size < min_size:
 | |
|                 print(len(modes), "modes fit in", size, "slots with start", i0)
 | |
|                 min_size = size
 | |
|                 min_start = i0
 | |
| 
 | |
| print()
 | |
| 
 | |
| # print check(min_size, min_start)
 | |
| 
 | |
| print("#define ACCESS_TABLE_SIZE", min_size)
 | |
| print("#define ACCESS_TABLE_HASH", min_start)
 | |
| 
 | |
| # for m in modes:
 | |
| #     print m, "=>", hash(m, min_start) % min_size
 |